From 9ce5a8529e75cb109ed9ba3fc788c94ef47b1080 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Sun, 7 Jan 2007 19:44:37 +0000 Subject: [PATCH] big restructure --- ND.pm | 27 +-- ND/Web/Pages/AddIntel.pm | 94 ++++++++ ND/Web/Pages/Alliances.pm | 162 +++++++++++++ ND/Web/Pages/Calls.pm | 245 ++++++++++++++++++++ ND/Web/Pages/Check.pm | 201 ++++++++++++++++ ND/Web/Pages/CovOp.pm | 86 +++++++ defrequest.pl => ND/Web/Pages/DefRequest.pm | 38 ++- ND/Web/Pages/EditRaid.pm | 214 +++++++++++++++++ ND/Web/Pages/Forum.pm | 166 +++++++++++++ ND/Web/Pages/Intel.pm | 243 +++++++++++++++++++ ND/Web/Pages/LaunchConfirmation.pm | 133 +++++++++++ ND/Web/Pages/Main.pm | 170 ++++++++++++++ ND/Web/Pages/MemberIntel.pm | 97 ++++++++ motd.pl => ND/Web/Pages/Motd.pm | 46 ++-- points.pl => ND/Web/Pages/PlanetNaps.pm | 47 ++-- top100.pl => ND/Web/Pages/Points.pm | 70 +++--- raids.pl => ND/Web/Pages/Raids.pm | 154 ++++++------ ND/Web/Pages/Resources.pm | 75 ++++++ ND/Web/Pages/Top100.pm | 89 +++++++ ND/Web/Pages/Users.pm | 152 ++++++++++++ addintel.pl | 81 ------- alliances.pl | 147 ------------ calls.pl | 227 ------------------ check.pl | 183 --------------- covop.pl | 69 ------ editRaid.pl | 196 ---------------- forum.pl | 150 ------------ intel.pl | 225 ------------------ launchConfirmation.pl | 120 ---------- main.pl | 156 ------------- memberIntel.pl | 76 ------ pages | 19 -- planetNaps.pl | 46 ---- resources.pl | 59 ----- startup.pl | 26 ++- users.pl | 133 ----------- 36 files changed, 2365 insertions(+), 2057 deletions(-) create mode 100644 ND/Web/Pages/AddIntel.pm create mode 100644 ND/Web/Pages/Alliances.pm create mode 100644 ND/Web/Pages/Calls.pm create mode 100644 ND/Web/Pages/Check.pm create mode 100644 ND/Web/Pages/CovOp.pm rename defrequest.pl => ND/Web/Pages/DefRequest.pm (67%) create mode 100644 ND/Web/Pages/EditRaid.pm create mode 100644 ND/Web/Pages/Forum.pm create mode 100644 ND/Web/Pages/Intel.pm create mode 100644 ND/Web/Pages/LaunchConfirmation.pm create mode 100644 ND/Web/Pages/Main.pm create mode 100644 ND/Web/Pages/MemberIntel.pm rename motd.pl => ND/Web/Pages/Motd.pm (65%) rename points.pl => ND/Web/Pages/PlanetNaps.pm (54%) rename top100.pl => ND/Web/Pages/Points.pm (54%) rename raids.pl => ND/Web/Pages/Raids.pm (62%) create mode 100644 ND/Web/Pages/Resources.pm create mode 100644 ND/Web/Pages/Top100.pm create mode 100644 ND/Web/Pages/Users.pm delete mode 100644 addintel.pl delete mode 100644 alliances.pl delete mode 100644 calls.pl delete mode 100644 check.pl delete mode 100644 covop.pl delete mode 100644 editRaid.pl delete mode 100644 forum.pl delete mode 100644 intel.pl delete mode 100644 launchConfirmation.pl delete mode 100644 main.pl delete mode 100644 memberIntel.pl delete mode 100644 pages delete mode 100644 planetNaps.pl delete mode 100644 resources.pl delete mode 100644 users.pl diff --git a/ND.pm b/ND.pm index e95198a..dd017f3 100755 --- a/ND.pm +++ b/ND.pm @@ -31,6 +31,9 @@ use Fcntl 'O_RDONLY'; use strict; use warnings FATAL => 'all'; +chdir '/var/www/ndawn/code'; +our %PAGES; +our $NOACCESS = HTML::Template->new(filename => 'templates/NoAccess.tmpl', global_vars => 1, cache => 1); sub handler { local $ND::r = shift; @@ -49,15 +52,16 @@ sub handler { if ($ENV{'SCRIPT_NAME'} =~ /(\w+)(\.(pl|php|pm))?$/){ $ND::PAGE = $1 unless $1 eq 'index' and $3 eq 'pl'; } - if ($ENV{REQUEST_URI} =~ m{^.*/(\w+)$}){ - param($1,1); - } - $ND::PAGE = '' unless defined $ND::PAGE; - page(); + $ND::PAGE = 'main' unless exists $PAGES{$ND::PAGE}; + + $PAGES{$ND::PAGE}->{parse}->($ENV{REQUEST_URI}); + + page($ND::PAGE); return Apache2::Const::OK; } sub page { + my ($PAGE) = @_; our $DBH = ND::DB::DB(); $DBH->do(q{SET timezone = 'GMT'}); @@ -84,14 +88,11 @@ sub page { $ATTACKER = 1 if $attack; } - tie my @pages, 'Tie::File', "/var/www/ndawn/code/pages", mode => O_RDONLY, memory => 0 or die $!; - $ND::PAGE = 'main' unless grep { /^$ND::PAGE$/ } @pages; - our $XML = 0; - $XML = 1 if param('xml') and $ND::PAGE =~ /^(raids)$/; - our $AJAX = 1; + $PAGES{$PAGE}->{process}->(); + my $type = 'text/html'; if ($XML){ $type = 'text/xml'; @@ -102,11 +103,7 @@ sub page { $ND::BODY->param(PAGE => '/'.$ND::PAGE); } - unless (my $return = do "$ND::PAGE.pl"){ - $ERROR .= "

couldn't parse $ND::PAGE: $@

" if $@; - $ERROR .= "

couldn't do $ND::PAGE: $!

" unless defined $return && defined $!; - $ERROR .= "

couldn't run $ND::PAGE

" unless $return; - } + $ND::BODY = $PAGES{$PAGE}->{render}->($DBH,$ND::BODY); unless ($XML){ my $fleetupdate = $DBH->selectrow_array('SELECT landing_tick FROM fleets WHERE uid = ? AND fleet = 0',undef,$UID); diff --git a/ND/Web/Pages/AddIntel.pm b/ND/Web/Pages/AddIntel.pm new file mode 100644 index 0000000..8c03a02 --- /dev/null +++ b/ND/Web/Pages/AddIntel.pm @@ -0,0 +1,94 @@ +#************************************************************************** +# 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 ND::Web::Pages::AddIntel; +use strict; +use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Forum; +use ND::Web::Include; + +$ND::PAGES{addintel} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'Add Intel and Scans'); + + my $error; + + return $ND::NOACCESS unless isMember(); + + if (defined param('cmd')){ + if (param('cmd') eq 'submit' || param('cmd') eq 'submit_message'){ + my $findscan = $DBH->prepare("SELECT scan_id FROM scans WHERE scan_id = ? AND tick >= tick() - 48"); + my $addscan = $DBH->prepare('INSERT INTO scans (scan_id,tick,"type") VALUES (?,tick(),?)'); + my $addpoint = $DBH->prepare('UPDATE users SET scan_points = scan_points + 1 WHERE uid = ? '); + my $intel = param('intel'); + my @scans; + while ($intel =~ m/http:\/\/game.planetarion.com\/showscan.pl\?scan_id=(\d+)/g){ + my %scan; + $scan{Scan} = $1; + $scan{Message} = "Scan $1: "; + $findscan->execute($1); + if ($findscan->rows == 0){ + if ($addscan->execute($1,$ND::UID)){ + $addpoint->execute($ND::UID); + $scan{Message} .= 'added'; + }else{ + $scan{Message} .= "something went wrong: $DBH->errstr"; + } + }else{ + $scan{Message} .= 'already exists'; + } + push @scans,\%scan; + } + $BODY->param(Scans => \@scans); + my $tick = $ND::TICK; + $tick = param('tick') if $tick =~ /^(\d+)$/; + my $addintel = $DBH->prepare(qq{SELECT add_intel(?,?,?,?,?,?,?,?,?,?,?)}); + while ($intel =~ m/(\d+):(\d+):(\d+)\*?\s+(\d+):(\d+):(\d+)\*?\s+.+(?:Ter|Cat|Xan|Zik)?\s+(\d+)\s+(Attack|Defend)\s+(\d+)/g){ + $addintel->execute($tick,$9, $1,$2,$3,$4,$5,$6,$7,$8,$ND::UID) or $error .= $DBH->errstr; + } + } + if (param('cmd') eq 'submit_message'){ + my $board = {id => 12}; + my $subject = param('subject'); + unless ($subject){ + if (param('intel') =~ /(.*\w.*)/){ + $subject = $1; + } + + } + if (my $thread = addForumThread $DBH,$board,$ND::UID,$subject){ + $error .= p 'Intel message added' if addForumPost $DBH,$thread,$ND::UID,param('intel') + } + } + } + $BODY->param(Tick => $ND::TICK); + $BODY->param(Error => $error); + return $BODY; +} +1; diff --git a/ND/Web/Pages/Alliances.pm b/ND/Web/Pages/Alliances.pm new file mode 100644 index 0000000..aec9ea4 --- /dev/null +++ b/ND/Web/Pages/Alliances.pm @@ -0,0 +1,162 @@ +#************************************************************************** +# 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 ND::Web::Pages::Alliances; +use strict; +use warnings FATAL => 'all'; +use ND::Include; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{alliances} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + my $error; + + $ND::TEMPLATE->param(TITLE => 'Alliances'); + + return $ND::NOACCESS unless isHC(); + + my $alliance; + if (defined param('alliance') && param('alliance') =~ /^(\d+)$/){ + my $query = $DBH->prepare(q{SELECT id,name, relationship FROM alliances WHERE id = ?}); + $alliance = $DBH->selectrow_hashref($query,undef,$1); + } + if ($alliance && defined param('cmd') && param ('cmd') eq 'change'){ + $DBH->begin_work; + if (param('crelationship')){ + my $value = escapeHTML(param('relationship')); + if ($DBH->do(q{UPDATE alliances SET relationship = ? WHERE id =?} + ,undef,$value,$alliance->{id})){ + $alliance->{relationship} = $value; + log_message $ND::UID,"HC set alliance: $alliance->{id} relationship: $value"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + my $coords = param('coords'); + my $findplanet = $DBH->prepare(q{SELECT id FROM current_planet_stats WHERE x = ? AND y = ? AND z = ?}); + my $addplanet = $DBH->prepare(q{ + UPDATE planets SET alliance_id = $2, nick = coalesce($3,nick) + WHERE id = $1; + }); + while ($coords =~ m/(\d+):(\d+):(\d+)(?:\s+nick=\s*(\S+))?/g){ + my ($id) = $DBH->selectrow_array($findplanet,undef,$1,$2,$3) or $ND::ERROR .= p $DBH->errstr; + if ($addplanet->execute($id,$alliance->{id},$4)){ + my $nick = ''; + $nick = '(nick $4)' if defined $4; + $error .= "

Added planet $1:$2:$3 $nick to this alliance

"; + intel_log $ND::UID,$id,"HC Added planet $1:$2:$3 $nick to alliance: $alliance->{id} ($alliance->{name})"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + + if ($alliance){ + $BODY->param(Alliance => $alliance->{name}); + $BODY->param(Id => $alliance->{id}); + my @relationships; + for my $relationship (" ","Friendly", "NAP", "Hostile"){ + push @relationships,{Rel => $relationship, Selected => defined $alliance->{relationship} && $relationship eq $alliance->{relationship}} + } + $BODY->param(Relationships => \@relationships); + + my $order = "p.x,p.y,p.z"; + if (defined param('order') && param('order') =~ /^(score|size|value|xp|hit_us|race)$/){ + $order = "$1 DESC"; + } + my $members = $DBH->prepare(qq{ + SELECT coords(x,y,z), nick, ruler, planet, race, size, score, value, xp, + planet_status,hit_us, sizerank, scorerank, valuerank, xprank + FROM current_planet_stats p + WHERE p.alliance_id = ? + ORDER BY $order}); + my @members; + $members->execute($alliance->{id}); + my $i = 0; + while (my $member = $members->fetchrow_hashref){ + $i++; + $member->{ODD} = $i % 2; + push @members,$member; + } + $BODY->param(Members => \@members); + + my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin, t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',qq{not ingal AND (t.alliance_id = ? OR t.alliance_id = ?) + AND (i.mission = 'Defend' OR i.mission = 'AllyDef') + AND (t.alliance_id != ? OR t.alliance_id IS NULL OR o.alliance_id != ? OR o.alliance_id IS NULL) + AND i.sender NOT IN (SELECT planet FROM users u NATURAL JOIN groupmembers gm WHERE gid = 8 AND planet IS NOT NULL) + })); + $query->execute($alliance->{id},$alliance->{id},$alliance->{id},$alliance->{id}) or $error .= $DBH->errstr; + + my @intel; + $i = 0; + while (my $intel = $query->fetchrow_hashref){ + if ($intel->{ingal}){ + $intel->{missionclass} = 'ingal'; + }else{ + $intel->{missionclass} = $intel->{mission}; + } + $i++; + $intel->{ODD} = $i % 2; + push @intel,$intel; + } + $BODY->param(Intel => \@intel); + }else{ + + my $order = "score DESC"; + if (defined param('order') && param('order') =~ /^(score|kscore|size|ksize|members|kmem|kxp|kxp|scavg|kscavg|siavg|ksiavg|kxpavg|kvalue|kvalavg)$/){ + $order = "$1 DESC"; + } + my $query = $DBH->prepare(qq{ + SELECT DISTINCT a.id,name,COALESCE(s.score,SUM(p.score)) AS score,COALESCE(s.size,SUM(p.size)) AS size,s.members,count(*) AS kmem, + COALESCE(SUM(p.score),-1) AS kscore, COALESCE(SUM(p.size),-1) AS ksize, COALESCE(SUM(p.xp),-1) AS kxp,COALESCE(SUM(p.value),-1) AS kvalue, + COALESCE(s.score/LEAST(s.members,60),-1) AS scavg, COALESCE(AVG(p.score)::int,-1) AS kscavg, COALESCE(s.size/s.members,-1) AS siavg, + COALESCE(AVG(p.size)::int,-1) AS ksiavg, COALESCE(AVG(p.xp)::int,-1) AS kxpavg, COALESCE(AVG(p.value)::int,-1) AS kvalavg + FROM alliances a + LEFT OUTER JOIN (SELECT * FROM alliance_stats WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON s.id = a.id + LEFT OUTER JOIN current_planet_stats p ON p.alliance_id = a.id + GROUP BY a.id,a.name,s.score,s.size,s.members + ORDER BY $order + })or $error .= $DBH->errstr; + $query->execute or $error .= $DBH->errstr; + my @alliances; + my $i = 0; + while (my $alliance = $query->fetchrow_hashref){ + next unless (defined $alliance->{score} || $alliance->{kscore} > 0); + $i++; + $alliance->{ODD} = $i % 2; + push @alliances, $alliance; + } + $BODY->param(Alliances => \@alliances); + } + $BODY->param(Error => $error); + return $BODY; +} +1; diff --git a/ND/Web/Pages/Calls.pm b/ND/Web/Pages/Calls.pm new file mode 100644 index 0000000..208b1a9 --- /dev/null +++ b/ND/Web/Pages/Calls.pm @@ -0,0 +1,245 @@ +#************************************************************************** +# 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 ND::Web::Pages::Calls; +use strict; +use warnings FATAL => 'all'; +use ND::Include; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{calls} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + #if ($uri =~ m{^/.*/(\w+)$}){ + # param('list',$1); + #} +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + my $error; + + $ND::TEMPLATE->param(TITLE => 'Defense Calls'); + + return $ND::NOACCESS unless isDC(); + + my $call; + if (defined param('call') && param('call') =~ /^(\d+)$/){ + my $query = $DBH->prepare(q{ + SELECT c.id, coords(p.x,p.y,p.z), c.landing_tick, c.info, covered, open, dc.username AS dc, u.defense_points,c.member + FROM calls c + JOIN users u ON c.member = u.uid + LEFT OUTER JOIN users dc ON c.dc = dc.uid + JOIN current_planet_stats p ON u.planet = p.id + WHERE c.id = ?}); + $call = $DBH->selectrow_hashref($query,undef,$1); + } + if ($call && defined param('cmd')){ + if (param('cmd') eq 'Submit'){ + $DBH->begin_work; + if (param('ctick')){ + if ($DBH->do(q{UPDATE calls SET landing_tick = ? WHERE id = ?} + ,undef,param('tick'),$call->{id})){ + $call->{landing_tick} = param('tick'); + log_message $ND::UID,"DC updated landing tick for call $call->{id}"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + if (param('cinfo')){ + if ($DBH->do(q{UPDATE calls SET info = ? WHERE id = ?} + ,undef,param('info'),$call->{id})){ + $call->{info} = param('info'); + log_message $ND::UID,"DC updated info for call $call->{id}"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; + }elsif(param('cmd') =~ /^(Cover|Uncover|Ignore|Open|Take) call$/){ + $error .= "test"; + my $extra_vars = ''; + if (param('cmd') eq 'Cover call'){ + $extra_vars = ", covered = TRUE, open = FALSE"; + }elsif (param('cmd') eq 'Uncover call'){ + $extra_vars = ", covered = FALSE, open = TRUE"; + }elsif (param('cmd') eq 'Ignore call'){ + $extra_vars = ", covered = FALSE, open = FALSE"; + }elsif (param('cmd') eq 'Open call'){ + $extra_vars = ", covered = FALSE, open = TRUE"; + } + if ($DBH->do(qq{UPDATE calls SET dc = ? $extra_vars WHERE id = ?}, + ,undef,$ND::UID,$call->{id})){ + $call->{covered} = (param('cmd') eq 'Cover call'); + $call->{open} = (param('cmd') =~ /^(Uncover|Open) call$/); + $call->{DC} = $ND::USER; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + }elsif(param('cmd') eq 'Remove'){ + $DBH->begin_work; + my $query = $DBH->prepare(q{DELETE FROM incomings WHERE id = ? AND call = ?}); + for my $param (param()){ + if ($param =~ /^change:(\d+)$/){ + if($query->execute($1,$call->{id})){ + log_message $ND::UID,"DC deleted fleet: $1, call $call->{id}"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; + }elsif(param('cmd') eq 'Change'){ + $DBH->begin_work; + my $query = $DBH->prepare(q{UPDATE incomings SET shiptype = ? WHERE id = ? AND call = ?}); + for my $param (param()){ + if ($param =~ /^change:(\d+)$/){ + my $shiptype = escapeHTML(param("shiptype:$1")); + if($query->execute($shiptype,$1,$call->{id})){ + log_message $ND::UID,"DC set fleet: $1, call $call->{id} to: $shiptype"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + + if ($call){ + $BODY->param(Call => $call->{id}); + $BODY->param(Coords => $call->{coords}); + $BODY->param(DefensePoints => $call->{defense_points}); + $BODY->param(LandingTick => $call->{landing_tick}); + $BODY->param(ETA => $call->{landing_tick}-$ND::TICK); + $BODY->param(Info => $call->{info}); + $BODY->param(DC => $call->{dc}); + if ($call->{covered}){ + $BODY->param(Cover => 'Uncover'); + }else{ + $BODY->param(Cover => 'Cover'); + } + if ($call->{open} && !$call->{covered}){ + $BODY->param(Ignore => 'Ignore'); + }else{ + $BODY->param(Ignore => 'Open'); + } + my $fleets = $DBH->prepare(q{ + SELECT id,mission,landing_tick,eta, back FROM fleets WHERE uid = ? AND (fleet = 0 OR (back >= ? AND landing_tick - eta - 11 < ? )) + ORDER BY fleet ASC}); + my $ships = $DBH->prepare('SELECT ship,amount FROM fleet_ships WHERE fleet = ?'); + $fleets->execute($call->{member},$call->{landing_tick},$call->{landing_tick}); + my @fleets; + my $i = 0; + while (my $fleet = $fleets->fetchrow_hashref){ + if ($fleet->{back} == $call->{landing_tick}){ + $fleet->{Fleetcatch} = 1; + } + $ships->execute($fleet->{id}); + my @ships; + while (my $ship = $ships->fetchrow_hashref){ + $i++; + $ship->{ODD} = $i % 2; + push @ships,$ship; + } + $fleet->{Ships} = \@ships; + push @fleets, $fleet; + } + $BODY->param(Fleets => \@fleets); + + my $attackers = $DBH->prepare(q{ + SELECT coords(p.x,p.y,p.z), p.planet_status, p.race,i.eta,i.amount,i.fleet,i.shiptype,p.relationship,p.alliance,i.id + FROM incomings i + JOIN current_planet_stats p ON i.sender = p.id + WHERE i.call = ? + ORDER BY p.x,p.y,p.z}); + $attackers->execute($call->{id}); + my @attackers; + $i = 0; + while(my $attacker = $attackers->fetchrow_hashref){ + $i++; + $attacker->{ODD} = $i % 2; + push @attackers,$attacker; + } + $BODY->param(Attackers => \@attackers); + }else{ + my $where = 'open AND c.landing_tick-6 > tick()'; + if (defined param('show')){ + if (param('show') eq 'covered'){ + $where = 'covered'; + }elsif (param('show') eq 'all'){ + $where = 'true'; + }elsif (param('show') eq 'uncovered'){ + $where = 'not covered'; + } + } + my $pointlimits = $DBH->prepare(q{SELECT value :: int FROM misc WHERE id = ?}); + my ($minpoints) = $DBH->selectrow_array($pointlimits,undef,'DEFMIN'); + my ($maxpoints) = $DBH->selectrow_array($pointlimits,undef,'DEFMAX'); + + my $query = $DBH->prepare(qq{ + SELECT c.id, coords(p.x,p.y,p.z), u.defense_points, c.landing_tick, c.dc, + TRIM('/' FROM concat(p2.race||' /')) AS race, TRIM('/' FROM concat(i.amount||' /')) AS amount, + TRIM('/' FROM concat(i.eta||' /')) AS eta, TRIM('/' FROM concat(i.shiptype||' /')) AS shiptype, + TRIM('/' FROM concat(c.landing_tick - tick() ||' /')) AS curreta, + TRIM('/' FROM concat(p2.alliance ||' /')) AS alliance, + TRIM('/' FROM concat(coords(p2.x,p2.y,p2.z) ||' /')) AS attackers + FROM calls c + JOIN incomings i ON i.call = c.id + JOIN users u ON c.member = u.uid + JOIN current_planet_stats p ON u.planet = p.id + JOIN current_planet_stats p2 ON i.sender = p2.id + WHERE $where + GROUP BY c.id, p.x,p.y,p.z, u.username, c.landing_tick, c.info,u.defense_points,c.dc + ORDER BY c.landing_tick DESC + })or $error .= $DBH->errstr; + $query->execute or $error .= $DBH->errstr; + my @calls; + my $i = 0; + my $tick = $ND::TICK; + while (my $call = $query->fetchrow_hashref){ + if ($call->{defense_points} < $minpoints){ + $call->{DefPrio} = 'LowestPrio'; + }elsif ($call->{defense_points} < $maxpoints){ + $call->{DefPrio} = 'MediumPrio'; + }else{ + $call->{DefPrio} = 'HighestPrio'; + } + while ($tick - 24 > $call->{landing_tick}){ + $tick -= 24; + push @calls,{}; + $i = 0; + } + $call->{dc} = 'Hostile' unless defined $call->{dc}; + $i++; + $call->{ODD} = $i % 2; + $call->{shiptype} = escapeHTML($call->{shiptype}); + push @calls, $call; + } + $BODY->param(Calls => \@calls); + } + $BODY->param(Error => $error); + return $BODY; +} +1; diff --git a/ND/Web/Pages/Check.pm b/ND/Web/Pages/Check.pm new file mode 100644 index 0000000..60600bb --- /dev/null +++ b/ND/Web/Pages/Check.pm @@ -0,0 +1,201 @@ +#************************************************************************** +# 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 ND::Web::Pages::Check; +use strict; +use warnings FATAL => 'all'; +no warnings qw(uninitialized); +use ND::Include; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{check} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + #TODO: Improved apache conf needed + #if ($uri =~ m{^/.*/((\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?(?: |:(\d+))?)$}){ + # param('coords',$1); + #} +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'Check planets and galaxies'); + + $BODY->param(isBC => isMember() && (isOfficer() || isBC)); + + return $ND::NOACCESS unless $ND::ATTACKER; + + my ($x,$y,$z); + if (param('coords') =~ /(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?(?: |:(\d+))?/){ + $x = $1; + $y = $2; + $z = $3; + $BODY->param(Coords => param('coords')); + }else{ + $ND::ERROR .= p b q{Couldn't parse coords}; + return $BODY; + } + + if (isMember() && param('cmd') eq 'arbiter'){ + my $query = $DBH->prepare(q{SELECT count(*) AS friendlies FROM current_planet_stats WHERE x = ? AND y = ? + AND (planet_status IN ('Friendly','NAP') OR relationship IN ('Friendly','NAP'))}); + my ($count) = $DBH->selectrow_array($query,undef,$x,$y); + if ($count > 0){ + $BODY->param(Arbiter => 'DO NOT ATTACK THIS GAL'); + }else{ + $BODY->param(Arbiter => 'KILL THESE BASTARDS'); + } + log_message $ND::UID,"Arbiter check on $x:$y"; + } + + my $where = ''; + my $extra_columns = ''; + + $where = 'AND z = ?' if defined $z; + if (isMember() && isOfficer()){ + $extra_columns = ",planet_status,hit_us, alliance,relationship,nick"; + }elsif (isMember() && isBC()){ + $extra_columns = ", planet_status,hit_us, alliance,relationship"; + } + + my $query = $DBH->prepare(qq{Select id,coords(x,y,z), ((ruler || ' OF ') || p.planet) as planet,race, size, score, value, xp, sizerank, scorerank, valuerank, xprank, 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 $extra_columns from current_planet_stats p LEFT OUTER JOIN covop_targets c ON p.id = c.planet where x = ? AND y = ? $where order by x,y,z asc}); + + if (defined $z){ + $query->execute($x,$y,$z); + }else{ + $query->execute($x,$y); + if (isMember() && (isBC() || isOfficer()) && !isHC()){ + log_message $ND::UID,"BC browsing $x:$y"; + } + } + my @planets; + my $planet_id = undef; + my $i = 0; + while (my ($id,$coords,$planet,$race,$size,$score,$value,$xp,$sizerank,$scorerank,$valuerank,$xprank + ,$fleetvalue,$resvalue,$planet_status,$hit_us,$alliance,$relationship,$nick) = $query->fetchrow){ + $planet_id = $id; + my %planet = (Coords => $coords, Planet => $planet, Race => $race, Size => "$size ($sizerank)" + , Score => "$score ($scorerank)", Value => "$value ($valuerank)", XP => "$xp ($xprank)" + , FleetValue => "$fleetvalue ($resvalue)"); + if (isMember() && (isOfficer() || isBC())){ + $planet{HitUs} = $hit_us; + $planet{Alliance} = "$alliance ($relationship)"; + $planet{Nick} = "$nick ($planet_status)"; + $planet{PlanetStatus} = $planet_status; + $planet{Relationship} = $relationship; + $planet{isBC} = 1; + if ($z && $alliance eq 'NewDawn'){ + log_message $ND::UID,"BC browsing ND planet $coords tick $ND::TICK"; + } + } + $i++; + $planet{ODD} = $i % 2; + push @planets,\%planet; + } + $BODY->param(Planets => \@planets); + + if ($z && $planet_id){ + $BODY->param(OnePlanet => 1); + + my $query = $DBH->prepare(q{ + SELECT i.mission, i.tick AS landingtick,MIN(eta) AS eta, i.amount, coords(p.x,p.y,p.z) AS target + FROM intel i + JOIN (planets + NATURAL JOIN planet_stats) p ON i.target = p.id + JOIN (planets + NATURAL JOIN planet_stats) p2 ON i.sender = p2.id + WHERE p.tick = ( SELECT max(tick) FROM planet_stats) AND i.tick > tick() AND i.uid = -1 + AND p2.tick = p.tick AND p2.id = ? + GROUP BY p.x,p.y,p.z,p2.x,p2.y,p2.z,i.mission,i.tick,i.amount,i.ingal,i.uid + ORDER BY p.x,p.y,p.z}); + $query->execute($planet_id); + my @missions; + while (my ($mission,$landingtick,$eta,$amount,$target) = $query->fetchrow){ + push @missions,{Target => $target, Mission => $mission, LandingTick => $landingtick + , ETA => $eta, Amount => $amount}; + } + $BODY->param(Missions => \@missions); + + my @scans; + $query = $DBH->prepare(q{SELECT value,tick FROM planet_stats + WHERE id = ? AND tick > tick() - 24}); + my $scan = q{ +

Value the last 24 ticks

+ }; + my $old = 0; + $query->execute($planet_id); + while (my($value,$tick) = $query->fetchrow){ + my $diff = $value-$old; + $old = $value; + my $class = 'Defend'; + $class = 'Attack' if $diff < 0; + $scan .= qq{}; + } + $scan .= q{
TickValueDifference
$tick$value$diff
}; + push @scans, {Scan => $scan}; + + $query = $DBH->prepare(q{SELECT x,y,z,tick FROM planet_stats WHERE id = ?}); + $scan = q{ +

Previous Coords

+ }; + $query->execute($planet_id); + $x = $y = $z = 0; + while (my($nx,$ny,$nz,$tick) = $query->fetchrow){ + if ($nx != $x || $ny != $y || $nz != $z){ + $x = $nx; + $y = $ny; + $z = $nz; + $scan .= qq{}; + } + } + $scan .= q{
TickValueDifference
$tick$x:$y:$z
}; + push @scans, {Scan => $scan}; + + $query = $DBH->prepare(q{SELECT DISTINCT ON (type) type,scan_id, tick, scan FROM scans WHERE planet = ? + GROUP BY type,scan_id, tick, scan ORDER BY type,tick DESC}); + $query->execute($planet_id); + my %scans; + while (my($type,$scan_id,$tick,$scan) = $query->fetchrow){ + $scans{$type} = [$scan_id,$tick,$scan]; + } + for my $type ('Planet','Jumpgate','Unit','Military','Fleet Analysis','Surface Analysis','Technology Analysis','News'){ + next unless exists $scans{$type}; + my $scan_id = $scans{$type}->[0]; + my $tick = $scans{$type}->[1]; + my $scan = $scans{$type}->[2]; + if ($ND::TICK - $tick > 10){ + $scan =~ s{}{}; + } + push @scans,{Scan => qq{ +

$type Scan from tick $tick

+ $scan}}; + } + + $BODY->param(Scans => \@scans); + } + return $BODY; +} + +1; diff --git a/ND/Web/Pages/CovOp.pm b/ND/Web/Pages/CovOp.pm new file mode 100644 index 0000000..5f1a59c --- /dev/null +++ b/ND/Web/Pages/CovOp.pm @@ -0,0 +1,86 @@ +#************************************************************************** +# 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 ND::Web::Pages::CovOp; +use strict; +use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{covop} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + if ($uri =~ m{^/.*/(\w+)$}){ + param('list',$1); + } +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'CovOp Targets'); + + return $ND::NOACCESS unless isMember(); + + my $show = q{AND ((planet_status IS NULL OR NOT planet_status IN ('Friendly','NAP')) AND (relationship IS NULL OR NOT relationship IN ('Friendly','NAP')))}; + $show = '' if defined param('show') && param('show') eq 'all'; + if (defined param('covop') && param('covop') =~ /^(\d+)$/){ + my $update = $DBH->prepare('UPDATE covop_targets SET covop_by = ?, last_covop = tick() WHERE planet = ? '); + $update->execute($ND::UID,$1); + } + + my $list = ''; + my $where = ''; + if (defined param('list') && param('list') eq 'distwhores'){ + $list = '&list=distwhores'; + $where = qq{WHERE dists > 0 $show + ORDER BY dists DESC,COALESCE(sec_centres::float/structures*100,0)ASC} + }else{ + $where = qq{WHERE MaxResHack > 130000 + $show + ORDER BY COALESCE(sec_centres::float/structures*100,0) ASC,MaxResHack DESC,metal+crystal+eonium DESC}; + } + + my $query = $DBH->prepare(qq{SELECT id, coords, metal, crystal, eonium, sec_centres::float/structures*100 AS secs, dists, last_covop, username, MaxResHack + FROM (SELECT p.id,coords(x,y,z), metal,crystal,eonium, + sec_centres,NULLIF(structures,0) AS structures,dists,last_covop, + u.username,max_bank_hack(metal,crystal,eonium,p.value,(SELECT value FROM + current_planet_stats WHERE id = ?)) AS MaxResHack, planet_status, relationship + FROM covop_targets c JOIN current_planet_stats p ON p.id = c.planet + LEFT OUTER JOIN users u ON u.uid = c.covop_by) AS foo + $where}); + $query->execute($ND::PLANET); + + my @targets; + my $i = 0; + while (my ($id,$coords,$metal,$crystal,$eonium,$seccents,$dists,$lastcovop,$user,$max) = $query->fetchrow){ + $i++; + push @targets,{Username => $user, Target => $id, Coords => $coords + , Metal => $metal, Crystal => $crystal, Eonium => $eonium, SecCents => $seccents + , Dists => $dists, MaxResHack => $max, LastCovOp => $lastcovop, List => $list, ODD => $i % 2}; + } + $BODY->param(Targets => \@targets); + return $BODY; +} + +1; diff --git a/defrequest.pl b/ND/Web/Pages/DefRequest.pm similarity index 67% rename from defrequest.pl rename to ND/Web/Pages/DefRequest.pm index c53f372..9329e31 100644 --- a/defrequest.pl +++ b/ND/Web/Pages/DefRequest.pm @@ -17,24 +17,38 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * #**************************************************************************/ +package ND::Web::Pages::DefRequest; use strict; use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; -$ND::TEMPLATE->param(TITLE => 'Request Defense'); +$ND::PAGES{defrequest} = {parse => \&parse, process => \&process, render=> \&render}; -our $BODY; -our $DBH; -my $error; +sub parse { +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'Request Defense'); + + my $error; -die "You don't have access" unless isMember(); + return $ND::NOACCESS unless isMember(); -if (defined param('cmd') && param('cmd') eq 'submit'){ - my $insert = $DBH->prepare('INSERT INTO defense_requests (uid,message) VALUES (?,?)'); - if($insert->execute($ND::UID,param('message'))){ - $BODY->param(Reply => param('message')); - }else{ - $error .= "".$DBH->errstr.""; + if (defined param('cmd') && param('cmd') eq 'submit'){ + my $insert = $DBH->prepare('INSERT INTO defense_requests (uid,message) VALUES (?,?)'); + if($insert->execute($ND::UID,param('message'))){ + $BODY->param(Reply => param('message')); + }else{ + $error .= "".$DBH->errstr.""; + } } + $BODY->param(Error => $error); + return $BODY; } -$BODY->param(Error => $error); 1; diff --git a/ND/Web/Pages/EditRaid.pm b/ND/Web/Pages/EditRaid.pm new file mode 100644 index 0000000..f7f8a9f --- /dev/null +++ b/ND/Web/Pages/EditRaid.pm @@ -0,0 +1,214 @@ +#************************************************************************** +# 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 ND::Web::Pages::EditRaid; +use strict; +use warnings FATAL => 'all'; +use ND::Include; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{editRaid} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + #if ($uri =~ m{^/.*/(\w+)$}){ + # param('list',$1); + #} +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + my $error; + + $ND::TEMPLATE->param(TITLE => 'Create/Edit Raids'); + + return $ND::NOACCESS unless isBC(); + + my @alliances = alliances(); + $BODY->param(Alliances => \@alliances); + + my $raid; + if (defined param 'raid' and param('raid') =~ /^(\d+)$/){ + my $query = $DBH->prepare(q{SELECT id,tick,waves,message,released_coords,open FROM raids WHERE id = ?}); + $raid = $DBH->selectrow_hashref($query,undef,$1); + } + if (defined param('cmd') && param('cmd') eq 'submit'){ + my $query = $DBH->prepare(q{INSERT INTO raids (tick,waves,message) VALUES(?,?,'')}); + if ($query->execute(param('tick'),param('waves'))){ + $raid = $DBH->last_insert_id(undef,undef,undef,undef,"raids_id_seq"); + my $query = $DBH->prepare(q{SELECT id,tick,waves,message,released_coords,open FROM raids WHERE id = ?}); + $raid = $DBH->selectrow_hashref($query,undef,$raid); + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + + if ($raid && defined param('cmd')){ + if (param('cmd') eq 'remove'){ + $DBH->do(q{UPDATE raids SET open = FALSE, removed = TRUE WHERE id = ?},undef,$raid->{id}); + }elsif (param('cmd') eq 'Open'){ + if($DBH->do(q{UPDATE raids SET open = TRUE, removed = FALSE WHERE id = ?},undef,$raid->{id})){ + $raid->{open} = 1; + $raid->{removed} = 0; + } + }elsif (param('cmd') eq 'Close'){ + if ($DBH->do(q{UPDATE raids SET open = FALSE WHERE id = ?},undef,$raid->{id})){ + $raid->{open} = 0; + } + }elsif (param('cmd') eq 'showcoords'){ + if($DBH->do(q{UPDATE raids SET released_coords = TRUE WHERE id = ?},undef,$raid->{id})){ + $raid->{released_coords} = 1; + } + }elsif (param('cmd') eq 'hidecoords'){ + if($DBH->do(q{UPDATE raids SET released_coords = FALSE WHERE id = ?},undef,$raid->{id})){ + $raid->{released_coords} = 0; + } + }elsif (param('cmd') eq 'comment'){ + $DBH->do(q{UPDATE raid_targets SET comment = ? WHERE id = ?} + ,undef,escapeHTML(param('comment')),param('target')) + or $error .= p($DBH->errstr); + + }elsif (param('cmd') eq 'change'){ + $DBH->begin_work; + my $message = escapeHTML(param('message')); + $raid->{message} = $message; + $raid->{waves} = param('waves'); + $raid->{tick} = param('tick'); + unless ($DBH->do(qq{UPDATE raids SET message = ?, tick = ?, waves = ? WHERE id = ?} + ,undef,$message,param('tick'),param('waves'),$raid->{id})){ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + my $sizelimit = ''; + if (param('sizelimit') =~ /^(\d+)$/){ + $sizelimit = "AND p.size >= $1"; + unless ($DBH->do(qq{DELETE FROM raid_targets WHERE id IN (SELECT t.id FROM current_planet_stats p + JOIN raid_targets t ON p.id = t.planet WHERE p.size < ? AND t.raid = ?)},undef,$1,$raid->{id})){ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + my $targets = param('targets'); + my $addtarget = $DBH->prepare(qq{INSERT INTO raid_targets(raid,planet) ( + SELECT ?, id FROM current_planet_stats p WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE) $sizelimit)}); + while ($targets =~ m/(\d+):(\d+)(?::(\d+))?/g){ + unless ($addtarget->execute($raid->{id},$1,$2,$3)){ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + if (param('alliance') =~ /^(\d+)$/ && $1 != 1){ + log_message $ND::UID,"BC adding alliance $1 to raid"; + my $addtarget = $DBH->prepare(qq{INSERT INTO raid_targets(raid,planet) ( + SELECT ?,id FROM current_planet_stats p WHERE alliance_id = ? $sizelimit)}); + unless ($addtarget->execute($raid->{id},$1)){ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + my $groups = $DBH->prepare('SELECT gid,groupname FROM groups WHERE attack'); + my $delgroup = $DBH->prepare(q{DELETE FROM raid_access WHERE raid = ? AND gid = ?}); + my $addgroup = $DBH->prepare(q{INSERT INTO raid_access (raid,gid) VALUES(?,?)}); + $groups->execute(); + while (my $group = $groups->fetchrow_hashref){ + my $query; + next unless defined param $group->{gid}; + if (param($group->{gid}) eq 'remove'){ + $query = $delgroup; + }elsif(param($group->{gid}) eq 'add'){ + $query = $addgroup; + } + if ($query){ + unless ($query->execute($raid->{id},$group->{gid})){ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + unless ($DBH->commit){ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + if ($raid && param('removeTarget')){ + $error .= "test"; + unless($DBH->do(q{DELETE FROM raid_targets WHERE raid = ? AND id = ?} + ,undef,$raid->{id},param('removeTarget'))){ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + + my $groups = $DBH->prepare(q{SELECT g.gid,g.groupname,raid FROM groups g LEFT OUTER JOIN (SELECT gid,raid FROM raid_access WHERE raid = ?) AS ra ON g.gid = ra.gid WHERE g.attack}); + $groups->execute($raid ? $raid->{id} : undef); + + my @addgroups; + my @remgroups; + while (my $group = $groups->fetchrow_hashref){ + if ($group->{raid}){ + push @remgroups,{Id => $group->{gid}, Name => $group->{groupname}}; + }else{ + push @addgroups,{Id => $group->{gid}, Name => $group->{groupname}}; + } + } + $BODY->param(RemoveGroups => \@remgroups); + $BODY->param(AddGroups => \@addgroups); + + + if ($raid){ + + $BODY->param(Raid => $raid->{id}); + if($raid->{open}){ + $BODY->param(Open => 'Close'); + }else{ + $BODY->param(Open => 'Open'); + } + if($raid->{released_coords}){ + $BODY->param(ShowCoords => 'hidecoords'); + $BODY->param(ShowCoordsName => 'Hide'); + }else{ + $BODY->param(ShowCoords => 'showcoords'); + $BODY->param(ShowCoordsName => 'Show'); + } + $BODY->param(Waves => $raid->{waves}); + $BODY->param(LandingTick => $raid->{tick}); + $BODY->param(Message => $raid->{message}); + + my $order = "p.x,p.y,p.z"; + if (param('order') && param('order') =~ /^(score|size|value|xp|race)$/){ + $order = "$1 DESC"; + } + + my $targetquery = $DBH->prepare(qq{SELECT r.id,coords(x,y,z),raid,comment,size,score,value,race,planet_status AS planetstatus,relationship,comment + FROM current_planet_stats p JOIN raid_targets r ON p.id = r.planet + WHERE r.raid = ? + ORDER BY $order}); + $targetquery->execute($raid->{id}) or $error .= $DBH->errstr; + my @targets; + while (my $target = $targetquery->fetchrow_hashref){ + push @targets,$target; + } + $BODY->param(Targets => \@targets); + }else{ + $BODY->param(Waves => 3); + $BODY->param(LandingTick => $ND::TICK+12); + } + $BODY->param(Error => $error); + return $BODY; +} + +1; diff --git a/ND/Web/Pages/Forum.pm b/ND/Web/Pages/Forum.pm new file mode 100644 index 0000000..3e8f30e --- /dev/null +++ b/ND/Web/Pages/Forum.pm @@ -0,0 +1,166 @@ +#************************************************************************** +# 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 ND::Web::Pages::Forum; +use strict; +use warnings FATAL => 'all'; +no warnings 'uninitialized'; +use ND::Web::Forum; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{forum} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + if ($uri =~ m{^/.*/allUnread$}){ + param('allUnread',1); + } +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + + $ND::TEMPLATE->param(TITLE => 'Forum'); + + my $board; + if(param('b')){ + my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post + FROM forum_boards fb NATURAL JOIN forum_access fa + WHERE fb.fbid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers + WHERE uid = $2)) + GROUP BY fb.fbid,fb.board}); + $board = $DBH->selectrow_hashref($boards,undef,param('b'),$ND::UID) or $ND::ERROR .= p($DBH->errstr); + } + + my $thread; + my $findThread = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject, bool_or(fa.post) AS post + FROM forum_boards fb NATURAL JOIN forum_access fa NATURAL JOIN forum_threads ft + WHERE ft.ftid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers + WHERE uid = $2)) + GROUP BY ft.ftid,ft.subject}); + if(param('t')){ + $thread = $DBH->selectrow_hashref($findThread,undef,param('t'),$ND::UID) or $ND::ERROR .= p($DBH->errstr); + } + + if (defined param('cmd') && param('cmd') eq 'forumpost'){ + $DBH->begin_work; + if ($board && $board->{post}){ + $thread = addForumThread $DBH,$board,$ND::UID,param('subject'); + } + if ($thread && $thread->{post}){ + addForumPost($DBH,$thread,$ND::UID,param('message')); + } + $DBH->commit or $ND::ERROR .= p($DBH->errstr); + } + + my $categories = $DBH->prepare(q{SELECT fcid AS id,category FROM forum_categories ORDER BY fcid}); + my $threads = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject,count(NULLIF(COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread,count(fp.fpid) AS posts, max(fp.time)::timestamp as last_post + FROM forum_threads ft JOIN forum_posts fp USING (ftid) LEFT OUTER JOIN (SELECT * FROM forum_thread_visits WHERE uid = $2) ftv ON ftv.ftid = ft.ftid + WHERE ft.fbid = $1 + GROUP BY ft.ftid, ft.subject + HAVING count(NULLIF(COALESCE(fp.time > ftv.time,TRUE),FALSE)) >= $3 + ORDER BY last_post DESC}); + + if ($thread){ #Display the thread + $BODY->param(Thread => viewForumThread $thread); + + }elsif($board){ #List threads in this board + $BODY->param(Board => $board->{board}); + $BODY->param(Post => $board->{post}); + $BODY->param(Id => $board->{id}); + $threads->execute($board->{id},$ND::UID,0) or $ND::ERROR .= p($DBH->errstr); + my $i = 0; + my @threads; + while (my $thread = $threads->fetchrow_hashref){ + $i++; + $thread->{Odd} = $i % 2; + push @threads,$thread; + } + $BODY->param(Threads => \@threads); + + }elsif(defined param('allUnread')){ #List threads in this board + $BODY->param(AllUnread => 1); + $BODY->param(Id => $board->{id}); + $categories->execute or $ND::ERROR .= p($DBH->errstr); + my @categories; + my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post + FROM forum_boards fb NATURAL JOIN forum_access fa + WHERE fb.fcid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers + WHERE uid = $2)) + GROUP BY fb.fbid,fb.board + ORDER BY fb.fbid + }); + while (my $category = $categories->fetchrow_hashref){ + $boards->execute($category->{id},$ND::UID) or $ND::ERROR .= p($DBH->errstr); + my @boards; + while (my $board = $boards->fetchrow_hashref){ + $threads->execute($board->{id},$ND::UID,1) or $ND::ERROR .= p($DBH->errstr); + my $i = 0; + my @threads; + while (my $thread = $threads->fetchrow_hashref){ + $i++; + $thread->{Odd} = $i % 2; + push @threads,$thread; + } + $board->{Threads} = \@threads; + delete $board->{post}; + push @boards,$board if $i > 0; + } + $category->{Boards} = \@boards; + delete $category->{id}; + push @categories,$category if @boards; + } + $BODY->param(Categories => \@categories); + + }else{ #List boards + $BODY->param(Overview => 1); + $categories->execute or $ND::ERROR .= p($DBH->errstr); + my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board,count(NULLIF(COALESCE(fp.fpid::boolean,FALSE) AND COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread + FROM forum_boards fb LEFT OUTER JOIN (forum_threads ft JOIN forum_posts fp USING (ftid)) ON fb.fbid = ft.fbid LEFT OUTER JOIN (SELECT * FROM forum_thread_visits WHERE uid = $2) ftv ON ftv.ftid = ft.ftid + WHERE fb.fcid = $1 AND + fb.fbid IN (SELECT fbid FROM forum_access WHERE gid IN (SELECT groups($2))) + GROUP BY fb.fbid, fb.board + ORDER BY fb.fbid }); + my @categories; + while (my $category = $categories->fetchrow_hashref){ + $boards->execute($category->{id},$ND::UID) or $ND::ERROR .= p($DBH->errstr); + my @boards; + my $i = 0; + while (my $board = $boards->fetchrow_hashref){ + $i++; + $board->{Odd} = $i % 2; + push @boards,$board; + } + $category->{Boards} = \@boards; + delete $category->{id}; + push @categories,$category if $i > 0; + } + $BODY->param(Categories => \@categories); + + } + return $BODY; +} + +1; + diff --git a/ND/Web/Pages/Intel.pm b/ND/Web/Pages/Intel.pm new file mode 100644 index 0000000..5a4a47c --- /dev/null +++ b/ND/Web/Pages/Intel.pm @@ -0,0 +1,243 @@ +#************************************************************************** +# 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 ND::Web::Pages::Intel; +use strict; +use warnings FATAL => 'all'; +use ND::Web::Forum; +use ND::Web::Include; +use ND::Include; +use CGI qw/:standard/; + +$ND::PAGES{intel} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + if ($uri =~ m{^/.*/(\w+)$}){ + param('list',$1); + } +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + + my $error; + + $ND::TEMPLATE->param(TITLE => 'Intel'); + + return $ND::NOACCESS unless isIntel() || isHC(); + + my $planet; + if (defined param('coords') && param('coords') =~ /^(\d+)(?: |:)(\d+)(?: |:)(\d+)$/){ + my $query = $DBH->prepare(q{SELECT x,y,z,coords(x,y,z),id, nick, alliance,alliance_id, planet_status,channel,ftid FROM current_planet_stats + WHERE x = ? AND y = ? AND z = ?}); + $planet = $DBH->selectrow_hashref($query,undef,$1,$2,$3) or $ND::ERROR .= p $DBH->errstr; + } + + my $showticks = 'AND (i.tick - i.eta) > (tick() - 48)'; + if (defined param('show')){ + if (param('show') eq 'all'){ + $showticks = ''; + }elsif (param('show') =~ /^(\d+)$/){ + $showticks = "AND (i.tick - i.eta) > (tick() - $1)"; + } + } + + my $thread; + if (defined $planet){ + $thread = $DBH->selectrow_hashref(q{SELECT ftid AS id, subject FROM forum_threads + where ftid = $1},undef,$planet->{ftid}) or $ND::ERROR .= p($DBH->errstr); + } + + if (defined param('cmd') && param('cmd') eq 'coords'){ + my $coords = param('coords'); + $DBH->do(q{CREATE TEMPORARY TABLE coordlist ( + x integer NOT NULL, + y integer NOT NULL, + z integer NOT NULL, + PRIMARY KEY (x,y,z) + )}); + my $insert = $DBH->prepare(q{INSERT INTO coordlist (x,y,z) VALUES(?,?,?)}); + while ($coords =~ m/(\d+):(\d+):(\d+)/g){ + $insert->execute($1,$2,$3); + } + my $planets = $DBH->prepare(q{SELECT (((p.x || ':') || p.y) || ':') || p.z AS coords, alliance FROM current_planet_stats p + JOIN coordlist c ON p.x = c.x AND p.y = c.y AND p.z = c.z + ORDER BY alliance, p.x, p.y, p.z}); + $planets->execute; + my @planets; + while (my $planet = $planets->fetchrow_hashref){ + push @planets,$planet; + } + $BODY->param(CoordList => \@planets); + } + if (defined $thread and defined param('cmd') and param('cmd') eq 'forumpost'){ + addForumPost($DBH,$thread,$ND::UID,param('message')); + } + + if ($planet && defined param('cmd')){ + if (param('cmd') eq 'change'){ + $DBH->begin_work; + if (param('cnick')){ + my $value = escapeHTML(param('nick')); + if ($DBH->do(q{UPDATE planets SET nick = ? WHERE id =?} + ,undef,$value,$planet->{id})){ + intel_log $ND::UID,$planet->{id},"Set nick to: $value"; + $planet->{nick} = $value; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + if (param('cchannel')){ + my $value = escapeHTML(param('channel')); + if ($DBH->do(q{UPDATE planets SET channel = ? WHERE id =?} + ,undef,$value,$planet->{id})){ + intel_log $ND::UID,$planet->{id},"Set channel to: $value"; + $planet->{channel} = $value; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + if (param('cstatus')){ + my $value = escapeHTML(param('status')); + if ($DBH->do(q{UPDATE planets SET planet_status = ? WHERE id =?} + ,undef,$value,$planet->{id})){ + intel_log $ND::UID,$planet->{id},"Set planet_status to: $value"; + $planet->{planet_status} = $value; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + if (param('calliance')){ + if ($DBH->do(q{UPDATE planets SET alliance_id = NULLIF(?,-1) WHERE id =?} + ,undef,param('alliance'),$planet->{id})){ + intel_log $ND::UID,$planet->{id},"Set alliance_id to: ".param('alliance'); + $planet->{alliance_id} = param('alliance'); + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + + if (param('coords')){ + my $channel = param('coords'); + $channel = $planet->{channel} if ($planet); + my $findchannel = $DBH->prepare('SELECT coords(x,y,z),alliance,nick,channel FROM current_planet_stats WHERE channel ILIKE ? '); + $findchannel->execute($channel); + my @channelusers; + while (my $user = $findchannel->fetchrow_hashref){ + push @channelusers,$user; + } + $BODY->param(ChannelUsers => \@channelusers); + } + + if ($planet){ + $BODY->param(Coords => $planet->{coords}); + $BODY->param(Planet => $planet->{id}); + $BODY->param(Nick => $planet->{nick}); + $BODY->param(Channel => $planet->{channel}); + my @status; + for my $status (" ","Friendly", "NAP", "Hostile"){ + push @status,{Status => $status, Selected => defined $planet->{planet_status} && $status eq $planet->{planet_status}} + } + $BODY->param(PlanetStatus => \@status); + my @alliances = alliances($planet->{alliance_id}); + $BODY->param(Alliances => \@alliances); + + $BODY->param(Thread => viewForumThread $thread); + + my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin',"t.id = ? $showticks")); + $query->execute($planet->{id}) or $error .= $DBH->errstr; + my @intellists; + my @incomings; + my $i = 0; + while (my $intel = $query->fetchrow_hashref){ + if ($intel->{ingal}){ + $intel->{missionclass} = 'ingal'; + }else{ + $intel->{missionclass} = $intel->{mission}; + } + $i++; + $intel->{ODD} = $i % 2; + push @incomings,$intel; + } + push @intellists,{Message => 'Incoming fleets', Intel => \@incomings, Origin => 1}; + + $query = $DBH->prepare(intelquery('t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',"o.id = ? $showticks")); + $query->execute($planet->{id}) or $error .= $DBH->errstr; + my @outgoings; + $i = 0; + while (my $intel = $query->fetchrow_hashref){ + if ($intel->{ingal}){ + $intel->{missionclass} = 'ingal'; + }else{ + $intel->{missionclass} = $intel->{mission}; + } + $i++; + $intel->{ODD} = $i % 2; + push @outgoings,$intel; + } + push @intellists,{Message => 'Outgoing Fleets', Intel => \@outgoings, Target => 1}; + + $BODY->param(IntelLIsts => \@intellists); + + }elsif(!param('coords')){ + my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin, t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',qq{not ingal + AND ((( t.alliance_id != o.alliance_id OR t.alliance_id IS NULL OR o.alliance_id IS NULL) AND i.mission != 'Attack') + OR ( t.alliance_id = o.alliance_id AND i.mission = 'Attack')) + AND i.sender NOT IN (SELECT planet FROM users u NATURAL JOIN groupmembers gm WHERE gid = 8 AND planet IS NOT NULL) + $showticks})); + $query->execute() or $error .= $DBH->errstr; + + my @intellists; + my @intel; + my $i = 0; + while (my $intel = $query->fetchrow_hashref){ + if ($intel->{ingal}){ + $intel->{missionclass} = 'ingal'; + }else{ + $intel->{missionclass} = $intel->{mission}; + } + $i++; + $intel->{ODD} = $i % 2; + push @intel,$intel; + } + push @intellists,{Message => q{Intel where alliances doesn't match}, Intel => \@intel, Origin => 1, Target => 1}; + $BODY->param(IntelLIsts => \@intellists); + } + my $query = $DBH->prepare(q{SELECT i.id, u.username, i.message, report_date FROM intel_messages i + JOIN users u ON u.uid = i.uid + WHERE NOT handled ORDER BY report_date}); + $query->execute; + my @messages; + while (my $message = $query->fetchrow_hashref){ + $message->{message} = parseMarkup($message->{message}); + push @messages,$message; + } + #$BODY->param(IntelMessages => \@messages); + $BODY->param(Error => $error); + return $BODY; +} +1; diff --git a/ND/Web/Pages/LaunchConfirmation.pm b/ND/Web/Pages/LaunchConfirmation.pm new file mode 100644 index 0000000..29cb13c --- /dev/null +++ b/ND/Web/Pages/LaunchConfirmation.pm @@ -0,0 +1,133 @@ +#************************************************************************** +# 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 ND::Web::Pages::LaunchCoonfirmation; +use strict; +use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; +use ND::Include; + +$ND::PAGES{launchConfirmation} = {parse => \&parse, process => \&process, render=> \&render}; + + +sub parse { +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'Launch Confirmation'); + + my $error; + + return $ND::NOACCESS unless isMember(); + + if (defined param('cmd') && param('cmd') eq 'submit'){ + my $missions = param('mission'); + my $findplanet = $DBH->prepare("SELECT planetid(?,?,?,?)"); + my $findattacktarget = $DBH->prepare(q{SELECT c.target,c.wave,c.launched FROM raid_claims c + JOIN raid_targets t ON c.target = t.id + JOIN raids r ON t.raid = r.id + WHERE c.uid = ? AND r.tick+c.wave-1 = ? AND t.planet = ? + AND r.open AND not r.removed}); + my $finddefensetarget = $DBH->prepare(q{SELECT NULL}); + my $addattackpoint = $DBH->prepare('UPDATE users SET attack_points = attack_points + 1 WHERE uid = ?'); + my $launchedtarget = $DBH->prepare('UPDATE raid_claims SET launched = True WHERE uid = ? AND target = ? AND wave = ?'); + my $addfleet = $DBH->prepare(qq{INSERT INTO fleets (uid,target,mission,landing_tick,fleet,eta,back) VALUES (?,?,?,?,(SELECT max(fleet)+1 from fleets WHERE uid = ?),?,?)}); + my $addships = $DBH->prepare('INSERT INTO fleet_ships (fleet,ship,amount) VALUES (?,?,?)'); + + my $fleet = $DBH->prepare("SELECT id FROM fleets WHERE uid = ? AND fleet = 0"); + my ($basefleet) = $DBH->selectrow_array($fleet,undef,$ND::UID); + unless ($basefleet){ + my $insert = $DBH->prepare(q{INSERT INTO fleets (uid,target,mission,landing_tick,fleet,eta,back) VALUES (?,?,'Full fleet',0,0,0,0)}); + $insert->execute($ND::UID,$ND::PLANET); + } + my @missions; + $DBH->begin_work; + while ($missions =~ m/\S+\s+(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)\s+\((?:(\d+)\+)?(\d+)\).*?(?:\d+hrs\s+)?\d+mins\s+(Attack|Defend|Return|Fake Attack|Fake Defend)(.*?)(?:Launching in tick (\d+), arrival in tick (\d+)|ETA: \d+, Return ETA: (\d+))/sg){ + my %mission; + + my $tick = $ND::TICK+$8; + $tick += $7 if defined $7; + my $eta = $8; + my $mission = $9; + my $x = $4; + my $y = $5; + my $z = $6; + $mission{Tick} = $tick; + $mission{Mission} = $mission; + $mission{Target} = "$x:$y:$z"; + if ($12){ + $tick = $12; + }elsif ($13){ + $eta += $13; + } + + my ($planet_id) = $DBH->selectrow_array($findplanet,undef,$x,$y,$z,$ND::TICK); + + my $findtarget = $finddefensetarget; + if ($mission eq 'Attack'){ + $findtarget = $findattacktarget; + }elsif ($mission eq 'Defend'){ + $findtarget = $finddefensetarget; + } + + $findtarget->execute($ND::UID,$tick,$planet_id); + + if ($findtarget->rows == 0){ + $mission{Warning} = "YOU DON'T HAVE A TARGET WITH THAT LANDING TICK"; + }elsif ($mission eq 'Attack'){ + my $claim = $findtarget->fetchrow_hashref; + if ($claim->{launched}){ + $mission{Warning} = "Already launched on this target:$claim->{target},$claim->{wave},$claim->{launched}"; + }else{ + $addattackpoint->execute($ND::UID); + $launchedtarget->execute($ND::UID,$claim->{target},$claim->{wave}); + $mission{Warning} = "OK:$claim->{target},$claim->{wave},$claim->{launched}"; + log_message $ND::UID,"Gave attack point for confirmation on $mission mission to $x:$y:$z, landing tick $tick"; + } + } + + $addfleet->execute($ND::UID,$planet_id,$mission,$tick,$ND::UID,$eta,$tick+$eta-1) or $error .= '

'.$DBH->errstr.'

'; + my $fleet = $DBH->last_insert_id(undef,undef,undef,undef,"fleets_id_seq"); + $mission{Fleet} = $fleet; + $mission{Back} = $tick+$eta-1; + my $ships = $10; + my @ships; + while ($ships =~ m/((?:\w+ )*\w+)\s+\w+\s+\w+\s+(?:Steal|Normal|Emp|Normal\s+Cloaked|Pod|Struc)\s+(\d+)/g){ + $addships->execute($fleet,$1,$2); + push @ships,{Ship => $1, Amount => $2}; + } + $mission{Ships} = \@ships; + log_message $ND::UID,"Pasted confirmation for $mission mission to $x:$y:$z, landing tick $tick"; + push @missions,\%mission; + } + $DBH->commit or $error .= '

'.$DBH->errstr.'

'; + $BODY->param(Missions => \@missions); + } + $BODY->param(Error => $error); + return $BODY; +} + + +1; diff --git a/ND/Web/Pages/Main.pm b/ND/Web/Pages/Main.pm new file mode 100644 index 0000000..3e8d751 --- /dev/null +++ b/ND/Web/Pages/Main.pm @@ -0,0 +1,170 @@ +#************************************************************************** +# 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 ND::Web::Pages::Main; +use strict; +use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Include; +use ND::Web::Include; + +$ND::PAGES{main} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'Main Page'); + + my $error; + + if (defined param('cmd')){ + if (param('cmd') eq 'fleet'){ + $DBH->begin_work; + my $fleet = $DBH->prepare("SELECT id FROM fleets WHERE uid = ? AND fleet = 0"); + my ($id) = $DBH->selectrow_array($fleet,undef,$ND::UID); + unless ($id){ + my $insert = $DBH->prepare(q{INSERT INTO fleets (uid,target,mission,landing_tick,fleet,eta,back) VALUES (?,?,'Full fleet',0,0,0,0)}); + $insert->execute($ND::UID,$ND::PLANET); + ($id) = $DBH->selectrow_array($fleet,undef,$ND::UID); + } + my $delete = $DBH->prepare("DELETE FROM fleet_ships WHERE fleet = ?"); + $delete->execute($id); + my $insert = $DBH->prepare('INSERT INTO fleet_ships (fleet,ship,amount) VALUES (?,?,?)'); + $fleet = param('fleet'); + $fleet =~ s/,//g; + while ($fleet =~ m/((?:[A-Z][a-z]+ )*[A-Z][a-z]+)\s+(\d+)/g){ + $insert->execute($id,$1,$2) or $error .= '

'.$DBH->errstr.'

'; + } + $fleet = $DBH->prepare('UPDATE fleets SET landing_tick = tick() WHERE id = ?'); + $fleet->execute($id); + $DBH->commit; + }elsif (param('cmd') eq 'Recall Fleets'){ + $DBH->begin_work; + my $updatefleets = $DBH->prepare('UPDATE fleets SET back = tick() + (tick() - (landing_tick - eta)) WHERE uid = ? AND id = ?'); + + for my $param (param()){ + if ($param =~ /^change:(\d+)$/){ + if($updatefleets->execute($ND::UID,$1)){ + log_message $ND::UID,"Member recalled fleet $1"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + $DBH->commit or $error .= '

'.$DBH->errstr.'

'; + }elsif (param('cmd') eq 'Change Fleets'){ + $DBH->begin_work; + my $updatefleets = $DBH->prepare('UPDATE fleets SET back = ? WHERE uid = ? AND id = ?'); + for my $param (param()){ + if ($param =~ /^change:(\d+)$/){ + if($updatefleets->execute(param("back:$1"),$ND::UID,$1)){ + log_message $ND::UID,"Member set fleet $1 to be back tick: ".param("back:$1"); + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + $DBH->commit or $error .= '

'.$DBH->errstr.'

'; + } + } + if (param('sms')){ my $query = $DBH->prepare('UPDATE users SET sms = ? WHERE uid = ?'); + $query->execute(escapeHTML(param('sms')),$ND::UID); + } + if (isMember() && !$ND::PLANET && defined param('planet') && (param('planet') =~ m/(\d+)(?: |:)(\d+)(?: |:)(\d+)/)){ + my $query = $DBH->prepare(q{ + UPDATE users SET planet = + (SELECT id from current_planet_stats where x = ? AND y = ? AND z = ?) + WHERE uid = ? }); + $query->execute($1,$2,$3,$ND::UID); + } + if(param('oldpass') && param('pass')){ + my $query = $DBH->prepare('UPDATE users SET password = MD5(?) WHERE password = MD5(?) AND uid = ?'); + $query->execute(param('pass'),param('oldpass'),$ND::UID); + } + + my ($motd) = $DBH->selectrow_array("SELECT value FROM misc WHERE id='MOTD'"); + + $BODY->param(MOTD => parseMarkup($motd)); + $BODY->param(Username => $ND::USER); + $BODY->param(isMember => isMember()); + $BODY->param(isHC => isHC()); + my @groups = map {name => $_}, sort keys %ND::GROUPS; + $BODY->param(Groups => \@groups); + + + my $query = $DBH->prepare(q{SELECT planet,defense_points,attack_points,scan_points,humor_points, (attack_points+defense_points+scan_points/20) as total_points, sms,rank FROM users WHERE uid = ?}); + + my ($planet,$defense_points,$attack_points,$scan_points,$humor_points,$total_points,$sms,$rank) = $DBH->selectrow_array($query,undef,$ND::UID); + + $ND::PLANET = $planet unless $ND::PLANET; + + $BODY->param(NDRank => $rank); + $BODY->param(DefensePoints => $defense_points); + $BODY->param(AttackPoints => $attack_points); + $BODY->param(ScanPoints => $scan_points); + $BODY->param(HumorPoints => $humor_points); + $BODY->param(TotalPoints => $total_points); + + $BODY->param(hasPlanet => $planet); + + if ($planet){ + my @row = $DBH->selectrow_array('SELECT ruler,planet,coords(x,y,z),size,sizerank + ,score,scorerank,value,valuerank,xp,xprank FROM current_planet_stats + WHERE id = ?',undef,$planet); + $BODY->param(PlanetName => "$row[0] OF $row[1] ($row[2])"); + $BODY->param(PlanetSize => "$row[3] ($row[4])"); + $BODY->param(PlanetScore => "$row[5] ($row[6])"); + $BODY->param(PlanetValue => "$row[7] ($row[8])"); + $BODY->param(PlanetXP => "$row[9] ($row[10])"); + } + + + $query = $DBH->prepare(q{SELECT f.fleet,f.id, coords(x,y,z) AS target, mission, sum(fs.amount) AS amount, landing_tick, back +FROM fleets f +JOIN fleet_ships fs ON f.id = fs.fleet +JOIN current_planet_stats p ON f.target = p.id +WHERE f.uid = ? AND (f.fleet = 0 OR back >= ?) +GROUP BY f.fleet,f.id, x,y,z, mission, landing_tick,back +ORDER BY f.fleet + }); + + $query->execute($ND::UID,$ND::TICK) or $error .= '

'.$DBH->errstr.'

'; + my @fleets; + my $i = 0; + while (my $fleet = $query->fetchrow_hashref){ + $i++; + $fleet->{ODD} = $i % 2; + push @fleets,$fleet; + } + $BODY->param(Fleets => \@fleets); + + $BODY->param(SMS => $sms); + $BODY->param(Error => $error); + return $BODY; +} + + +1; + diff --git a/ND/Web/Pages/MemberIntel.pm b/ND/Web/Pages/MemberIntel.pm new file mode 100644 index 0000000..c70b52b --- /dev/null +++ b/ND/Web/Pages/MemberIntel.pm @@ -0,0 +1,97 @@ +#************************************************************************** +# 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 ND::Web::Pages::MemberIntel; +use strict; +use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{memberIntel} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + if ($uri =~ m{^/.*/(\w+)$}){ + param('list',$1); + } +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + my $error; + + $ND::TEMPLATE->param(TITLE => 'Member Intel'); + + return $ND::NOACCESS unless isHC(); + + my $showticks = 'AND i.tick > tick()'; + if (defined param('show')){ + if (param('show') eq 'all'){ + $showticks = ''; + }elsif (param('show') =~ /^(\d+)$/){ + $showticks = "AND (i.tick - i.eta) > (tick() - $1)"; + } + } + + + my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin, coords(t.x,t.y,t.z) AS target, t.nick',"t.alliance_id = 1 $showticks")); + $query->execute() or $error .= $DBH->errstr; + my @intellists; + my @incomings; + my $i = 0; + while (my $intel = $query->fetchrow_hashref){ + if ($intel->{ingal}){ + $intel->{missionclass} = 'ingal'; + }else{ + $intel->{missionclass} = $intel->{mission}; + } + $intel->{oalliance} = ' ' unless $intel->{oalliance}; + $i++; + $intel->{ODD} = $i % 2; + push @incomings,$intel; + } + push @intellists,{Message => 'Incoming fleets', Intel => \@incomings, Origin => 1}; + + $query = $DBH->prepare(intelquery('o.nick,coords(o.x,o.y,o.z) AS origin,t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',"o.alliance_id = 1 $showticks")); + $query->execute() or $error .= $DBH->errstr; + my @outgoings; + $i = 0; + while (my $intel = $query->fetchrow_hashref){ + if ($intel->{ingal}){ + $intel->{missionclass} = 'ingal'; + }else{ + $intel->{missionclass} = $intel->{mission}; + } + $intel->{talliance} = ' ' unless $intel->{talliance}; + $i++; + $intel->{ODD} = $i % 2; + push @outgoings,$intel; + } + push @intellists,{Message => 'Outgoing Fleets', Intel => \@outgoings, Target => 1}; + + $BODY->param(IntelLIsts => \@intellists); + + $BODY->param(Error => $error); + return $BODY; +} +1; diff --git a/motd.pl b/ND/Web/Pages/Motd.pm similarity index 65% rename from motd.pl rename to ND/Web/Pages/Motd.pm index b324cc0..a0ad8a4 100644 --- a/motd.pl +++ b/ND/Web/Pages/Motd.pm @@ -17,28 +17,44 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * #**************************************************************************/ +package ND::Web::Pages::Motd; use strict; use warnings FATAL => 'all'; use ND::Include; +use CGI qw/:standard/; +use ND::Web::Include; -$ND::TEMPLATE->param(TITLE => 'Edit MOTD'); +$ND::PAGES{motd} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + + $ND::TEMPLATE->param(TITLE => 'Edit MOTD'); -our $BODY; -our $DBH; -die "You don't have access" unless isHC(); + return $ND::NOACCESS unless isHC(); -if (defined param 'cmd' and param('cmd') eq 'change'){ - $DBH->begin_work; - my $query = $DBH->prepare(q{UPDATE misc SET value= ? WHERE id='MOTD'}); - my $motd = escapeHTML(param('motd')); - $query->execute($motd); - log_message $ND::UID,"Updated MOTD"; - $DBH->commit; - $BODY->param(MOTD => $motd); -}else{ - my ($motd) = $DBH->selectrow_array(q{SELECT value FROM misc WHERE id='MOTD'}); - $BODY->param(MOTD => $motd); + if (defined param 'cmd' and param('cmd') eq 'change'){ + $DBH->begin_work; + my $query = $DBH->prepare(q{UPDATE misc SET value= ? WHERE id='MOTD'}); + my $motd = escapeHTML(param('motd')); + $query->execute($motd); + log_message $ND::UID,"Updated MOTD"; + $DBH->commit; + $BODY->param(MOTD => $motd); + }else{ + my ($motd) = $DBH->selectrow_array(q{SELECT value FROM misc WHERE id='MOTD'}); + $BODY->param(MOTD => $motd); + } + return $BODY; } 1; diff --git a/points.pl b/ND/Web/Pages/PlanetNaps.pm similarity index 54% rename from points.pl rename to ND/Web/Pages/PlanetNaps.pm index e1a1886..13aafb5 100644 --- a/points.pl +++ b/ND/Web/Pages/PlanetNaps.pm @@ -17,38 +17,43 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * #**************************************************************************/ +package ND::Web::Pages::PlanetNaps; use strict; use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; -$ND::TEMPLATE->param(TITLE => 'Top Members'); +$ND::PAGES{planetNaps} = {parse => \&parse, process => \&process, render=> \&render}; -our $BODY; -our $DBH; +sub parse { + my ($uri) = @_; +} -die "You don't have access" unless isMember(); +sub process { -my $type = "total"; -if (defined param('type') && param('type') =~ /^(defense|attack|total|humor|scan|rank)$/){ - $type = $1; } -$type .= '_points' unless ($type eq 'rank'); -my $order = 'DESC'; -$order = 'ASC' if ($type eq 'rank'); +sub render { + my ($DBH,$BODY) = @_; + my $error; + + $ND::TEMPLATE->param(TITLE => 'List planet naps'); -my $limit = 'LIMIT 10'; -$limit = '' if isHC(); + return $ND::NOACCESS unless isHC(); -my $query = $DBH->prepare("SELECT username,defense_points,attack_points,scan_points,humor_points, (attack_points+defense_points+scan_points/20) as total_points, rank FROM users WHERE uid IN (SELECT uid FROM groupmembers WHERE gid = 2) ORDER BY $type $order $limit"); -$query->execute; + my $query = $DBH->prepare(qq{Select coords(x,y,z), ((ruler || ' OF ') || p.planet) as planet,race, size, score, value, xp, sizerank, scorerank, valuerank, xprank, 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, planet_status,hit_us, alliance,relationship,nick from current_planet_stats p LEFT OUTER JOIN covop_targets c ON p.id = c.planet WHERE planet_status IN ('Friendly','NAP') order by x,y,z asc}); -my @members; -my $i = 0; -while (my ($username,$defense,$attack,$scan,$humor,$total,$rank) = $query->fetchrow){ - $i++; - push @members,{Username => $username, Defense => $defense, Attack => $attack - , Scan => $scan, Humor => $humor, Total => $total, Rank => $rank, ODD => $i % 2}; + $query->execute or $error .= p($DBH->errstr); + my @planets; + my $i = 0; + while (my $planet = $query->fetchrow_hashref){ + $i++; + $planet->{ODD} = $i % 2; + push @planets,$planet; + } + $BODY->param(Planets => \@planets); + $BODY->param(Error => $error); + return $BODY; } -$BODY->param(Members => \@members); 1; diff --git a/top100.pl b/ND/Web/Pages/Points.pm similarity index 54% rename from top100.pl rename to ND/Web/Pages/Points.pm index 1e3b85c..30512fb 100644 --- a/top100.pl +++ b/ND/Web/Pages/Points.pm @@ -17,55 +17,51 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * #**************************************************************************/ +package ND::Web::Pages::Points; use strict; use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; -$ND::TEMPLATE->param(TITLE => 'Top100 '); +$ND::PAGES{points} = {parse => \&parse, process => \&process, render=> \&render}; -our $BODY; -our $DBH; -my $error = ''; +sub parse { +} -$BODY->param(isHC => isHC()); +sub process { +} -die "You don't have access" unless isMember(); +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'Top Members'); -my $offset = 0; -if (defined param('offset') && param('offset') =~ /^(\d+)$/){ - $offset = $1; -} -$BODY->param(Offset => $offset); -$BODY->param(PrevOffset => $offset - 100); -$BODY->param(NextOffset => $offset + 100); + return $ND::NOACCESS unless isMember(); -my $order = 'scorerank'; -if (defined param('order') && param('order') =~ /^(scorerank|sizerank|valuerank|xprank|hit_us)$/){ - $order = $1; -} -$BODY->param(Order => $order); -$order .= ' DESC' if ($order eq 'hit_us'); + my $type = "total"; + if (defined param('type') && param('type') =~ /^(defense|attack|total|humor|scan|rank)$/){ + $type = $1; + } + $type .= '_points' unless ($type eq 'rank'); + my $order = 'DESC'; + $order = 'ASC' if ($type eq 'rank'); -my $extra_columns = ''; -if (isHC()){ - $extra_columns = ",planet_status,hit_us, alliance,relationship,nick"; -} -my $query = $DBH->prepare(qq{SELECT coords(x,y,z),((ruler || ' OF ') || planet) as planet,race, - size, score, value, xp, sizerank, scorerank, valuerank, xprank - $extra_columns FROM current_planet_stats ORDER BY $order LIMIT 100 OFFSET ?}); -$query->execute($offset) or $error .= p($DBH->errstr); -my @planets; -my $i = 0; -while (my $planet = $query->fetchrow_hashref){ - if (isHC){ - $planet->{isHC} = 1; + my $limit = 'LIMIT 10'; + $limit = '' if isHC(); + + my $query = $DBH->prepare("SELECT username,defense_points,attack_points,scan_points,humor_points, (attack_points+defense_points+scan_points/20) as total_points, rank FROM users WHERE uid IN (SELECT uid FROM groupmembers WHERE gid = 2) ORDER BY $type $order $limit"); + $query->execute; + + my @members; + my $i = 0; + while (my ($username,$defense,$attack,$scan,$humor,$total,$rank) = $query->fetchrow){ + $i++; + push @members,{Username => $username, Defense => $defense, Attack => $attack + , Scan => $scan, Humor => $humor, Total => $total, Rank => $rank, ODD => $i % 2}; } - $i++; - $planet->{ODD} = $i % 2; - push @planets,$planet; + $BODY->param(Members => \@members); + return $BODY; } -$BODY->param(Planets => \@planets); -$BODY->param(Error => $error); 1; diff --git a/raids.pl b/ND/Web/Pages/Raids.pm similarity index 62% rename from raids.pl rename to ND/Web/Pages/Raids.pm index a3cb3cc..fcaf6b1 100644 --- a/raids.pl +++ b/ND/Web/Pages/Raids.pm @@ -17,84 +17,101 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * #**************************************************************************/ +package ND::Web::Pages::Raids; use strict; use warnings FATAL => 'all'; use ND::Include; use POSIX; -our $BODY; -our $DBH; -our $XML; - -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); +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{raids} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + #if ($uri =~ m{^/.*/(\w+)$}){ + # param('list',$1); + #} +} + +sub process { + $ND::XML = 1 if param('xml'); } -if (defined param('cmd') && defined param('target') && defined param('wave') && param('target') =~ /^(\d+)$/ && param('wave') =~ /^(\d+)$/){ - my $target = param('target'); - my $wave = param('wave'); - - my $findtarget = $DBH->prepare("SELECT rt.id FROM raid_targets rt NATURAL JOIN raid_access ra NATURAL JOIN groupmembers where uid = ? AND id = ?"); - my $result = $DBH->selectrow_array($findtarget,undef,$ND::UID,$target); - if ($result != $target){ - die("You don't have access to that target"); +sub render { + my ($DBH,$BODY) = @_; + + 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); } - $DBH->begin_work; - 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 (defined param('cmd') && defined param('target') && defined param('wave') && param('target') =~ /^(\d+)$/ && param('wave') =~ /^(\d+)$/){ + my $target = param('target'); + my $wave = param('wave'); + + my $findtarget = $DBH->prepare("SELECT rt.id FROM raid_targets rt NATURAL JOIN raid_access ra NATURAL JOIN groupmembers where uid = ? AND id = ?"); + my $result = $DBH->selectrow_array($findtarget,undef,$ND::UID,$target); + if ($result != $target){ + return $ND::NOACCESS; + } + + $DBH->begin_work; + 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 '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 '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."; + 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 ($ND::XML && $raid){ + generateClaimXml($raid,undef,$target); } } - $DBH->commit; - if ($XML && $raid){ - generateClaimXml($raid,undef,$target); + if ($ND::XML && $raid && param('cmd') eq 'update' ){ + my $from; + if (param('from') =~ /^[-\d\ \:\.]+$/){ + $from = param('from'); + } + generateClaimXml($raid,$from); } -} -if ($XML && $raid && param('cmd') eq 'update' ){ - my $from; - if (param('from') =~ /^[-\d\ \:\.]+$/){ - $from = param('from'); + if ($ND::XML && param('cmd') eq 'gettargets' ){ + $_ = listTargets(); + $BODY->param(TargetList => $_); } - generateClaimXml($raid,$from); -} -if ($XML && param('cmd') eq 'gettargets' ){ - $_ = listTargets(); - $BODY->param(TargetList => $_); -} -unless ($XML){ + return $BODY if $ND::XML; + $ND::TEMPLATE->param(TITLE => 'Raids'); #$ND::TEMPLATE->param(HEADER => ''); if ($raid){#We have a raid, so list all targets @@ -110,12 +127,12 @@ unless ($XML){ $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}); + 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){ @@ -187,7 +204,7 @@ ORDER BY size}); $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 = ?)}); + id IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?)}); $query->execute($ND::UID); my @raids; while (my $raid = $query->fetchrow_hashref){ @@ -197,7 +214,7 @@ id IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?)}); 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 = ?))}); + 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){ @@ -206,5 +223,6 @@ OR id NOT IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = $BODY->param(ClosedRaids => \@raids); } } + return $BODY; } 1; diff --git a/ND/Web/Pages/Resources.pm b/ND/Web/Pages/Resources.pm new file mode 100644 index 0000000..66b3444 --- /dev/null +++ b/ND/Web/Pages/Resources.pm @@ -0,0 +1,75 @@ +#************************************************************************** +# 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 ND::Web::Pages::Resources; +use strict; +use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{resources} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + my $error; + + $ND::TEMPLATE->param(TITLE => 'Alliance Resources'); + + return $ND::NOACCESS unless isHC(); + + my $order = "respplanet DESC"; + if (defined param('order') && param('order') =~ /^(size|score|resources|respplanet|nscore|nscore2|nscore3)$/){ + $order = "$1 DESC"; + } + + + my $query = $DBH->prepare(qq{ + SELECT a.id,a.name,a.relationship,s.members,s.score,s.size,r.resources,r.planets, resources/planets AS respplanet, + resources / 300 AS scoregain, score + (resources / 300) AS nscore, + (resources/planets*LEAST(members,60))/300 AS scoregain2, score + (resources/planets*LEAST(members,60))/300 AS nscore2, + (s.size::int8*(1464-tick())*250)/100 + score + (resources/planets*LEAST(members,60))/300 AS nscore3, + (s.size::int8*(1464-tick())*250)/100 AS scoregain3 + FROM (SELECT alliance_id AS id,sum(metal+crystal+eonium) AS resources, count(*) AS planets + FROM planets p join covop_targets c ON p.id = c.planet GROUP by alliance_id) r + NATURAL JOIN alliances a + LEFT OUTER JOIN (SELECT * FROM alliance_stats WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON a.id = s.id + ORDER BY $order + }); + $query->execute; + my @alliances; + my $i = 0; + while (my $alliance = $query->fetchrow_hashref){ + $i++; + $alliance->{ODD} = $i % 2; + push @alliances,$alliance; + } + $BODY->param(Alliances => \@alliances); + + $BODY->param(Error => $error); + return $BODY; +} +1; diff --git a/ND/Web/Pages/Top100.pm b/ND/Web/Pages/Top100.pm new file mode 100644 index 0000000..a962b2d --- /dev/null +++ b/ND/Web/Pages/Top100.pm @@ -0,0 +1,89 @@ +#************************************************************************** +# 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 ND::Web::Pages::Top100; +use strict; +use warnings FATAL => 'all'; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{top100} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + #TODO: Need to fix some links first + #if ($uri =~ m{^/[^/]+/(\w+)}){ + # param('order',$1); + #} +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + $ND::TEMPLATE->param(TITLE => 'Top100 '); + + my $error = ''; + + $BODY->param(isHC => isHC()); + + return $ND::NOACCESS unless isMember(); + + my $offset = 0; + if (defined param('offset') && param('offset') =~ /^(\d+)$/){ + $offset = $1; + } + $BODY->param(Offset => $offset); + $BODY->param(PrevOffset => $offset - 100); + $BODY->param(NextOffset => $offset + 100); + + my $order = 'scorerank'; + if (defined param('order') && param('order') =~ /^(scorerank|sizerank|valuerank|xprank|hit_us)$/){ + $order = $1; + } + $BODY->param(Order => $order); + $order .= ' DESC' if ($order eq 'hit_us'); + + + my $extra_columns = ''; + if (isHC()){ + $extra_columns = ",planet_status,hit_us, alliance,relationship,nick"; + } + my $query = $DBH->prepare(qq{SELECT coords(x,y,z),((ruler || ' OF ') || planet) as planet,race, + size, score, value, xp, sizerank, scorerank, valuerank, xprank + $extra_columns FROM current_planet_stats ORDER BY $order LIMIT 100 OFFSET ?}); + $query->execute($offset) or $error .= p($DBH->errstr); + my @planets; + my $i = 0; + while (my $planet = $query->fetchrow_hashref){ + if (isHC){ + $planet->{isHC} = 1; + } + $i++; + $planet->{ODD} = $i % 2; + push @planets,$planet; + } + $BODY->param(Planets => \@planets); + $BODY->param(Error => $error); + return $BODY; +} + +1; diff --git a/ND/Web/Pages/Users.pm b/ND/Web/Pages/Users.pm new file mode 100644 index 0000000..a53f9a5 --- /dev/null +++ b/ND/Web/Pages/Users.pm @@ -0,0 +1,152 @@ +#************************************************************************** +# 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 ND::Web::Pages::Users; +use strict; +use warnings FATAL => 'all'; +use ND::Include; +use CGI qw/:standard/; +use ND::Web::Include; + +$ND::PAGES{users} = {parse => \&parse, process => \&process, render=> \&render}; + +sub parse { + my ($uri) = @_; + #if ($uri =~ m{^/.*/(\w+)$}){ + # param('list',$1); + #} +} + +sub process { + +} + +sub render { + my ($DBH,$BODY) = @_; + + $ND::TEMPLATE->param(TITLE => 'Users'); + + return $ND::NOACCESS unless isHC(); + + my $error = ''; + my $user; + if (defined param('user') && param('user') =~ /^(\d+)$/){ + my $query = $DBH->prepare(q{ + SELECT uid,username,hostmask,coords(x,y,z) AS planet,attack_points,defense_points,scan_points,humor_points + FROM users u LEFT OUTER JOIN current_planet_stats p ON u.planet = p.id + WHERE uid = ?; + }) or $error .= "

Something went wrong:

"; + $user = $DBH->selectrow_hashref($query,undef,$1) or $error.= "

Something went wrong: ".$DBH->errstr."

"; + } + + + if ($user && defined param('cmd') && param('cmd') eq 'change'){ + $DBH->begin_work; + for my $param (param()){ + if ($param =~ /^c:(\w+)$/){ + my $column = $1; + my $value = param($column); + if ($column eq 'planet'){ + if ($value eq ''){ + $value = undef; + }elsif($value =~ /^(\d+)\D+(\d+)\D+(\d+)$/){ + ($value) = $DBH->selectrow_array(q{SELECT id FROM + current_planet_stats WHERE x = ? and y = ? and z =?} + ,undef,$1,$2,$3); + } + } + if ($DBH->do(qq{UPDATE users SET $column = ? WHERE uid = ? } + ,undef,$value,$user->{uid})){ + $user->{$column} = param($column); + log_message $ND::UID,"HC set $column to $value for user: $user->{uid}"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + my $groups = $DBH->prepare('SELECT gid,groupname FROM groups'); + my $delgroup = $DBH->prepare(q{DELETE FROM groupmembers WHERE uid = ? AND gid = ?}); + my $addgroup = $DBH->prepare(q{INSERT INTO groupmembers (uid,gid) VALUES(?,?)}); + $groups->execute(); + while (my $group = $groups->fetchrow_hashref){ + my $query; + next unless defined param($group->{gid}); + if (param($group->{gid}) eq 'remove'){ + $query = $delgroup; + }elsif(param($group->{gid}) eq 'add'){ + $query = $addgroup; + } + if ($query){ + if ($query->execute($user->{uid},$group->{gid})){ + my ($action,$a2) = ('added','to'); + ($action,$a2) = ('removed','from') if param($group->{gid}) eq 'remove'; + log_message $ND::UID,"HC $action user: $user->{uid} ($user->{username}) $a2 group: $group->{gid} ($group->{groupname})"; + }else{ + $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + } + } + $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; + } + + if ($user){ + $BODY->param(User => $user->{uid}); + $BODY->param(Username => $user->{username}); + $BODY->param(Hostmask => $user->{hostmask}); + $BODY->param(Planet => $user->{planet}); + $BODY->param(Attack_points => $user->{attack_points}); + $BODY->param(Defense_points => $user->{defense_points}); + $BODY->param(Scan_points => $user->{scan_points}); + $BODY->param(humor_points => $user->{humor_points}); + + my $groups = $DBH->prepare(q{SELECT g.gid,g.groupname,uid FROM groups g LEFT OUTER JOIN (SELECT gid,uid FROM groupmembers WHERE uid = ?) AS gm ON g.gid = gm.gid}); + $groups->execute($user->{uid}); + + my @addgroups; + my @remgroups; + while (my $group = $groups->fetchrow_hashref){ + if ($group->{uid}){ + push @remgroups,{Id => $group->{gid}, Name => $group->{groupname}}; + }else{ + push @addgroups,{Id => $group->{gid}, Name => $group->{groupname}}; + } + } + $BODY->param(RemoveGroups => \@remgroups); + $BODY->param(AddGroups => \@addgroups); + + }else{ + my $query = $DBH->prepare(qq{SELECT u.uid,username,TRIM(',' FROM concat(g.groupname||',')) AS groups + FROM users u LEFT OUTER JOIN (groupmembers gm NATURAL JOIN groups g) ON gm.uid = u.uid + WHERE u.uid > 0 + GROUP BY u.uid,username + ORDER BY username})or $error .= $DBH->errstr; + $query->execute or $error .= $DBH->errstr; + my @users; + my $i = 0; + while (my $user = $query->fetchrow_hashref){ + $i++; + $user->{ODD} = $i % 2; + push @users, $user; + } + $BODY->param(Users => \@users); + } + $BODY->param(Error => $error); + return $BODY; +} +1; diff --git a/addintel.pl b/addintel.pl deleted file mode 100644 index b3d5aed..0000000 --- a/addintel.pl +++ /dev/null @@ -1,81 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Web::Forum; - -$ND::TEMPLATE->param(TITLE => 'Add Intel and Scans'); - -our $BODY; -our $DBH; -our $ERROR; -my $error; - -die "You don't have access" unless isMember(); - -if (defined param('cmd')){ - if (param('cmd') eq 'submit' || param('cmd') eq 'submit_message'){ - my $findscan = $DBH->prepare("SELECT scan_id FROM scans WHERE scan_id = ? AND tick >= tick() - 48"); - my $addscan = $DBH->prepare('INSERT INTO scans (scan_id,tick,"type") VALUES (?,tick(),?)'); - my $addpoint = $DBH->prepare('UPDATE users SET scan_points = scan_points + 1 WHERE uid = ? '); - my $intel = param('intel'); - my @scans; - while ($intel =~ m/http:\/\/game.planetarion.com\/showscan.pl\?scan_id=(\d+)/g){ - my %scan; - $scan{Scan} = $1; - $scan{Message} = "Scan $1: "; - $findscan->execute($1); - if ($findscan->rows == 0){ - if ($addscan->execute($1,$ND::UID)){ - $addpoint->execute($ND::UID); - $scan{Message} .= 'added'; - }else{ - $scan{Message} .= "something went wrong: $DBH->errstr"; - } - }else{ - $scan{Message} .= 'already exists'; - } - push @scans,\%scan; - } - $BODY->param(Scans => \@scans); - my $tick = $ND::TICK; - $tick = param('tick') if $tick =~ /^(\d+)$/; - my $addintel = $DBH->prepare(qq{SELECT add_intel(?,?,?,?,?,?,?,?,?,?,?)}); - while ($intel =~ m/(\d+):(\d+):(\d+)\*?\s+(\d+):(\d+):(\d+)\*?\s+.+(?:Ter|Cat|Xan|Zik)?\s+(\d+)\s+(Attack|Defend)\s+(\d+)/g){ - $addintel->execute($tick,$9, $1,$2,$3,$4,$5,$6,$7,$8,$ND::UID) or $error .= $DBH->errstr; - } - } - if (param('cmd') eq 'submit_message'){ - my $board = {id => 12}; - my $subject = param('subject'); - unless ($subject){ - if (param('intel') =~ /(.*\w.*)/){ - $subject = $1; - } - - } - if (my $thread = addForumThread $DBH,$board,$ND::UID,$subject){ - $error .= p 'Intel message added' if addForumPost $DBH,$thread,$ND::UID,param('intel') - } - } -} -$BODY->param(Tick => $ND::TICK); -$BODY->param(Error => $error); -1; diff --git a/alliances.pl b/alliances.pl deleted file mode 100644 index 4f89a48..0000000 --- a/alliances.pl +++ /dev/null @@ -1,147 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Include; -our $BODY; -our $DBH; -our $ERROR; -my $error; - -$ND::TEMPLATE->param(TITLE => 'Alliances'); - -die "You don't have access" unless isHC(); - -my $alliance; -if (defined param('alliance') && param('alliance') =~ /^(\d+)$/){ - my $query = $DBH->prepare(q{SELECT id,name, relationship FROM alliances WHERE id = ?}); - $alliance = $DBH->selectrow_hashref($query,undef,$1); -} -if ($alliance && defined param('cmd') && param ('cmd') eq 'change'){ - $DBH->begin_work; - if (param('crelationship')){ - my $value = escapeHTML(param('relationship')); - if ($DBH->do(q{UPDATE alliances SET relationship = ? WHERE id =?} - ,undef,$value,$alliance->{id})){ - $alliance->{relationship} = $value; - log_message $ND::UID,"HC set alliance: $alliance->{id} relationship: $value"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - my $coords = param('coords'); - my $findplanet = $DBH->prepare(q{SELECT id FROM current_planet_stats WHERE x = ? AND y = ? AND z = ?}); - my $addplanet = $DBH->prepare(q{ -UPDATE planets SET alliance_id = $2, nick = coalesce($3,nick) -WHERE id = $1; - }); - while ($coords =~ m/(\d+):(\d+):(\d+)(?:\s+nick=\s*(\S+))?/g){ - my ($id) = $DBH->selectrow_array($findplanet,undef,$1,$2,$3) or $ERROR .= p $DBH->errstr; - if ($addplanet->execute($id,$alliance->{id},$4)){ - my $nick = ''; - $nick = '(nick $4)' if defined $4; - $error .= "

Added planet $1:$2:$3 $nick to this alliance

"; - intel_log $ND::UID,$id,"HC Added planet $1:$2:$3 $nick to alliance: $alliance->{id} ($alliance->{name})"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; -} - -if ($alliance){ - $BODY->param(Alliance => $alliance->{name}); - $BODY->param(Id => $alliance->{id}); - my @relationships; - for my $relationship (" ","Friendly", "NAP", "Hostile"){ - push @relationships,{Rel => $relationship, Selected => defined $alliance->{relationship} && $relationship eq $alliance->{relationship}} - } - $BODY->param(Relationships => \@relationships); - - my $order = "p.x,p.y,p.z"; - if (defined param('order') && param('order') =~ /^(score|size|value|xp|hit_us|race)$/){ - $order = "$1 DESC"; - } - my $members = $DBH->prepare(qq{ -SELECT coords(x,y,z), nick, ruler, planet, race, size, score, value, xp, - planet_status,hit_us, sizerank, scorerank, valuerank, xprank - FROM current_planet_stats p -WHERE p.alliance_id = ? -ORDER BY $order}); - my @members; - $members->execute($alliance->{id}); - my $i = 0; - while (my $member = $members->fetchrow_hashref){ - $i++; - $member->{ODD} = $i % 2; - push @members,$member; - } - $BODY->param(Members => \@members); - - my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin, t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',qq{not ingal AND (t.alliance_id = ? OR t.alliance_id = ?) - AND (i.mission = 'Defend' OR i.mission = 'AllyDef') - AND (t.alliance_id != ? OR t.alliance_id IS NULL OR o.alliance_id != ? OR o.alliance_id IS NULL) - AND i.sender NOT IN (SELECT planet FROM users u NATURAL JOIN groupmembers gm WHERE gid = 8 AND planet IS NOT NULL) - })); - $query->execute($alliance->{id},$alliance->{id},$alliance->{id},$alliance->{id}) or $error .= $DBH->errstr; - - my @intel; - $i = 0; - while (my $intel = $query->fetchrow_hashref){ - if ($intel->{ingal}){ - $intel->{missionclass} = 'ingal'; - }else{ - $intel->{missionclass} = $intel->{mission}; - } - $i++; - $intel->{ODD} = $i % 2; - push @intel,$intel; - } - $BODY->param(Intel => \@intel); -}else{ - - my $order = "score DESC"; - if (defined param('order') && param('order') =~ /^(score|kscore|size|ksize|members|kmem|kxp|kxp|scavg|kscavg|siavg|ksiavg|kxpavg|kvalue|kvalavg)$/){ - $order = "$1 DESC"; - } - my $query = $DBH->prepare(qq{ -SELECT DISTINCT a.id,name,COALESCE(s.score,SUM(p.score)) AS score,COALESCE(s.size,SUM(p.size)) AS size,s.members,count(*) AS kmem, - COALESCE(SUM(p.score),-1) AS kscore, COALESCE(SUM(p.size),-1) AS ksize, COALESCE(SUM(p.xp),-1) AS kxp,COALESCE(SUM(p.value),-1) AS kvalue, - COALESCE(s.score/LEAST(s.members,60),-1) AS scavg, COALESCE(AVG(p.score)::int,-1) AS kscavg, COALESCE(s.size/s.members,-1) AS siavg, - COALESCE(AVG(p.size)::int,-1) AS ksiavg, COALESCE(AVG(p.xp)::int,-1) AS kxpavg, COALESCE(AVG(p.value)::int,-1) AS kvalavg -FROM alliances a - LEFT OUTER JOIN (SELECT * FROM alliance_stats WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON s.id = a.id - LEFT OUTER JOIN current_planet_stats p ON p.alliance_id = a.id -GROUP BY a.id,a.name,s.score,s.size,s.members -ORDER BY $order - })or $error .= $DBH->errstr; - $query->execute or $error .= $DBH->errstr; - my @alliances; - my $i = 0; - while (my $alliance = $query->fetchrow_hashref){ - next unless (defined $alliance->{score} || $alliance->{kscore} > 0); - $i++; - $alliance->{ODD} = $i % 2; - push @alliances, $alliance; - } - $BODY->param(Alliances => \@alliances); -} -$BODY->param(Error => $error); -1; diff --git a/calls.pl b/calls.pl deleted file mode 100644 index 342f47d..0000000 --- a/calls.pl +++ /dev/null @@ -1,227 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Include; -our $BODY; -our $DBH; -my $error; - -$ND::TEMPLATE->param(TITLE => 'Defense Calls'); - -die "You don't have access" unless isDC(); - -my $call; -if (defined param('call') && param('call') =~ /^(\d+)$/){ - my $query = $DBH->prepare(q{ -SELECT c.id, coords(p.x,p.y,p.z), c.landing_tick, c.info, covered, open, dc.username AS dc, u.defense_points,c.member -FROM calls c - JOIN users u ON c.member = u.uid - LEFT OUTER JOIN users dc ON c.dc = dc.uid - JOIN current_planet_stats p ON u.planet = p.id -WHERE c.id = ?}); - $call = $DBH->selectrow_hashref($query,undef,$1); -} -if ($call && defined param('cmd')){ - if (param('cmd') eq 'Submit'){ - $DBH->begin_work; - if (param('ctick')){ - if ($DBH->do(q{UPDATE calls SET landing_tick = ? WHERE id = ?} - ,undef,param('tick'),$call->{id})){ - $call->{landing_tick} = param('tick'); - log_message $ND::UID,"DC updated landing tick for call $call->{id}"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - if (param('cinfo')){ - if ($DBH->do(q{UPDATE calls SET info = ? WHERE id = ?} - ,undef,param('info'),$call->{id})){ - $call->{info} = param('info'); - log_message $ND::UID,"DC updated info for call $call->{id}"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; - }elsif(param('cmd') =~ /^(Cover|Uncover|Ignore|Open|Take) call$/){ - $error .= "test"; - my $extra_vars = ''; - if (param('cmd') eq 'Cover call'){ - $extra_vars = ", covered = TRUE, open = FALSE"; - }elsif (param('cmd') eq 'Uncover call'){ - $extra_vars = ", covered = FALSE, open = TRUE"; - }elsif (param('cmd') eq 'Ignore call'){ - $extra_vars = ", covered = FALSE, open = FALSE"; - }elsif (param('cmd') eq 'Open call'){ - $extra_vars = ", covered = FALSE, open = TRUE"; - } - if ($DBH->do(qq{UPDATE calls SET dc = ? $extra_vars WHERE id = ?}, - ,undef,$ND::UID,$call->{id})){ - $call->{covered} = (param('cmd') eq 'Cover call'); - $call->{open} = (param('cmd') =~ /^(Uncover|Open) call$/); - $call->{DC} = $ND::USER; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - }elsif(param('cmd') eq 'Remove'){ - $DBH->begin_work; - my $query = $DBH->prepare(q{DELETE FROM incomings WHERE id = ? AND call = ?}); - for my $param (param()){ - if ($param =~ /^change:(\d+)$/){ - if($query->execute($1,$call->{id})){ - log_message $ND::UID,"DC deleted fleet: $1, call $call->{id}"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - } - $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; - }elsif(param('cmd') eq 'Change'){ - $DBH->begin_work; - my $query = $DBH->prepare(q{UPDATE incomings SET shiptype = ? WHERE id = ? AND call = ?}); - for my $param (param()){ - if ($param =~ /^change:(\d+)$/){ - my $shiptype = escapeHTML(param("shiptype:$1")); - if($query->execute($shiptype,$1,$call->{id})){ - log_message $ND::UID,"DC set fleet: $1, call $call->{id} to: $shiptype"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - } - $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; - } -} - -if ($call){ - $BODY->param(Call => $call->{id}); - $BODY->param(Coords => $call->{coords}); - $BODY->param(DefensePoints => $call->{defense_points}); - $BODY->param(LandingTick => $call->{landing_tick}); - $BODY->param(ETA => $call->{landing_tick}-$ND::TICK); - $BODY->param(Info => $call->{info}); - $BODY->param(DC => $call->{dc}); - if ($call->{covered}){ - $BODY->param(Cover => 'Uncover'); - }else{ - $BODY->param(Cover => 'Cover'); - } - if ($call->{open} && !$call->{covered}){ - $BODY->param(Ignore => 'Ignore'); - }else{ - $BODY->param(Ignore => 'Open'); - } - my $fleets = $DBH->prepare(q{ -SELECT id,mission,landing_tick,eta, back FROM fleets WHERE uid = ? AND (fleet = 0 OR (back >= ? AND landing_tick - eta - 11 < ? )) -ORDER BY fleet ASC}); - my $ships = $DBH->prepare('SELECT ship,amount FROM fleet_ships WHERE fleet = ?'); - $fleets->execute($call->{member},$call->{landing_tick},$call->{landing_tick}); - my @fleets; - my $i = 0; - while (my $fleet = $fleets->fetchrow_hashref){ - if ($fleet->{back} == $call->{landing_tick}){ - $fleet->{Fleetcatch} = 1; - } - $ships->execute($fleet->{id}); - my @ships; - while (my $ship = $ships->fetchrow_hashref){ - $i++; - $ship->{ODD} = $i % 2; - push @ships,$ship; - } - $fleet->{Ships} = \@ships; - push @fleets, $fleet; - } - $BODY->param(Fleets => \@fleets); - - my $attackers = $DBH->prepare(q{ -SELECT coords(p.x,p.y,p.z), p.planet_status, p.race,i.eta,i.amount,i.fleet,i.shiptype,p.relationship,p.alliance,i.id -FROM incomings i - JOIN current_planet_stats p ON i.sender = p.id -WHERE i.call = ? -ORDER BY p.x,p.y,p.z}); - $attackers->execute($call->{id}); - my @attackers; - $i = 0; - while(my $attacker = $attackers->fetchrow_hashref){ - $i++; - $attacker->{ODD} = $i % 2; - push @attackers,$attacker; - } - $BODY->param(Attackers => \@attackers); -}else{ - my $where = 'open AND c.landing_tick-6 > tick()'; - if (defined param('show')){ - if (param('show') eq 'covered'){ - $where = 'covered'; - }elsif (param('show') eq 'all'){ - $where = 'true'; - }elsif (param('show') eq 'uncovered'){ - $where = 'not covered'; - } - } - my $pointlimits = $DBH->prepare(q{SELECT value :: int FROM misc WHERE id = ?}); - my ($minpoints) = $DBH->selectrow_array($pointlimits,undef,'DEFMIN'); - my ($maxpoints) = $DBH->selectrow_array($pointlimits,undef,'DEFMAX'); - - my $query = $DBH->prepare(qq{ -SELECT c.id, coords(p.x,p.y,p.z), u.defense_points, c.landing_tick, c.dc, - TRIM('/' FROM concat(p2.race||' /')) AS race, TRIM('/' FROM concat(i.amount||' /')) AS amount, - TRIM('/' FROM concat(i.eta||' /')) AS eta, TRIM('/' FROM concat(i.shiptype||' /')) AS shiptype, - TRIM('/' FROM concat(c.landing_tick - tick() ||' /')) AS curreta, - TRIM('/' FROM concat(p2.alliance ||' /')) AS alliance, - TRIM('/' FROM concat(coords(p2.x,p2.y,p2.z) ||' /')) AS attackers -FROM calls c - JOIN incomings i ON i.call = c.id - JOIN users u ON c.member = u.uid - JOIN current_planet_stats p ON u.planet = p.id - JOIN current_planet_stats p2 ON i.sender = p2.id -WHERE $where -GROUP BY c.id, p.x,p.y,p.z, u.username, c.landing_tick, c.info,u.defense_points,c.dc -ORDER BY c.landing_tick DESC - })or $error .= $DBH->errstr; - $query->execute or $error .= $DBH->errstr; - my @calls; - my $i = 0; - my $tick = $ND::TICK; - while (my $call = $query->fetchrow_hashref){ - if ($call->{defense_points} < $minpoints){ - $call->{DefPrio} = 'LowestPrio'; - }elsif ($call->{defense_points} < $maxpoints){ - $call->{DefPrio} = 'MediumPrio'; - }else{ - $call->{DefPrio} = 'HighestPrio'; - } - while ($tick - 24 > $call->{landing_tick}){ - $tick -= 24; - push @calls,{}; - $i = 0; - } - $call->{dc} = 'Hostile' unless defined $call->{dc}; - $i++; - $call->{ODD} = $i % 2; - $call->{shiptype} = escapeHTML($call->{shiptype}); - push @calls, $call; - } - $BODY->param(Calls => \@calls); -} -$BODY->param(Error => $error); -1; diff --git a/check.pl b/check.pl deleted file mode 100644 index 04f49d3..0000000 --- a/check.pl +++ /dev/null @@ -1,183 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -no warnings qw(uninitialized); -use ND::Include; - -$ND::TEMPLATE->param(TITLE => 'Check planets and galaxies'); - -our $BODY; -our $DBH; - -$BODY->param(isBC => isMember() && (isOfficer() || isBC)); - - -die "You don't have access" unless $ND::ATTACKER; - -my ($x,$y,$z); -if (param('coords') =~ /(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?(?: |:(\d+))?/){ - $x = $1; - $y = $2; - $z = $3; - $BODY->param(Coords => param('coords')); -}else{ - die "Bad coords"; -} - -if (isMember() && param('cmd') eq 'arbiter'){ - my $query = $DBH->prepare(q{SELECT count(*) AS friendlies FROM current_planet_stats WHERE x = ? AND y = ? - AND (planet_status IN ('Friendly','NAP') OR relationship IN ('Friendly','NAP'))}); - my ($count) = $DBH->selectrow_array($query,undef,$x,$y); - if ($count > 0){ - $BODY->param(Arbiter => 'DO NOT ATTACK THIS GAL'); - }else{ - $BODY->param(Arbiter => 'KILL THESE BASTARDS'); - } - log_message $ND::UID,"Arbiter check on $x:$y"; -} - -my $where = ''; -my $extra_columns = ''; - -$where = 'AND z = ?' if defined $z; -if (isMember() && isOfficer()){ - $extra_columns = ",planet_status,hit_us, alliance,relationship,nick"; -}elsif (isMember() && isBC()){ - $extra_columns = ", planet_status,hit_us, alliance,relationship"; -} - -my $query = $DBH->prepare(qq{Select id,coords(x,y,z), ((ruler || ' OF ') || p.planet) as planet,race, size, score, value, xp, sizerank, scorerank, valuerank, xprank, 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 $extra_columns from current_planet_stats p LEFT OUTER JOIN covop_targets c ON p.id = c.planet where x = ? AND y = ? $where order by x,y,z asc}); - -if (defined $z){ - $query->execute($x,$y,$z); -}else{ - $query->execute($x,$y); - if (isMember() && (isBC() || isOfficer()) && !isHC()){ - log_message $ND::UID,"BC browsing $x:$y"; - } -} -my @planets; -my $planet_id = undef; -my $i = 0; -while (my ($id,$coords,$planet,$race,$size,$score,$value,$xp,$sizerank,$scorerank,$valuerank,$xprank - ,$fleetvalue,$resvalue,$planet_status,$hit_us,$alliance,$relationship,$nick) = $query->fetchrow){ - $planet_id = $id; - my %planet = (Coords => $coords, Planet => $planet, Race => $race, Size => "$size ($sizerank)" - , Score => "$score ($scorerank)", Value => "$value ($valuerank)", XP => "$xp ($xprank)" - , FleetValue => "$fleetvalue ($resvalue)"); - if (isMember() && (isOfficer() || isBC())){ - $planet{HitUs} = $hit_us; - $planet{Alliance} = "$alliance ($relationship)"; - $planet{Nick} = "$nick ($planet_status)"; - $planet{PlanetStatus} = $planet_status; - $planet{Relationship} = $relationship; - $planet{isBC} = 1; - if ($z && $alliance eq 'NewDawn'){ - log_message $ND::UID,"BC browsing ND planet $coords tick $ND::TICK"; - } - } - $i++; - $planet{ODD} = $i % 2; - push @planets,\%planet; -} -$BODY->param(Planets => \@planets); - -if ($z && $planet_id){ - $BODY->param(OnePlanet => 1); - - my $query = $DBH->prepare(q{ -SELECT i.mission, i.tick AS landingtick,MIN(eta) AS eta, i.amount, coords(p.x,p.y,p.z) AS target -FROM intel i - JOIN (planets - NATURAL JOIN planet_stats) p ON i.target = p.id - JOIN (planets - NATURAL JOIN planet_stats) p2 ON i.sender = p2.id -WHERE p.tick = ( SELECT max(tick) FROM planet_stats) AND i.tick > tick() AND i.uid = -1 - AND p2.tick = p.tick AND p2.id = ? -GROUP BY p.x,p.y,p.z,p2.x,p2.y,p2.z,i.mission,i.tick,i.amount,i.ingal,i.uid -ORDER BY p.x,p.y,p.z}); - $query->execute($planet_id); - my @missions; - while (my ($mission,$landingtick,$eta,$amount,$target) = $query->fetchrow){ - push @missions,{Target => $target, Mission => $mission, LandingTick => $landingtick - , ETA => $eta, Amount => $amount}; - } - $BODY->param(Missions => \@missions); - - my @scans; - $query = $DBH->prepare(q{SELECT value,tick FROM planet_stats - WHERE id = ? AND tick > tick() - 24}); - my $scan = q{ -

Value the last 24 ticks

-}; - my $old = 0; - $query->execute($planet_id); - while (my($value,$tick) = $query->fetchrow){ - my $diff = $value-$old; - $old = $value; - my $class = 'Defend'; - $class = 'Attack' if $diff < 0; - $scan .= qq{}; - } - $scan .= q{
TickValueDifference
$tick$value$diff
}; - push @scans, {Scan => $scan}; - - $query = $DBH->prepare(q{SELECT x,y,z,tick FROM planet_stats WHERE id = ?}); - $scan = q{ -

Previous Coords

-}; - $query->execute($planet_id); - $x = $y = $z = 0; - while (my($nx,$ny,$nz,$tick) = $query->fetchrow){ - if ($nx != $x || $ny != $y || $nz != $z){ - $x = $nx; - $y = $ny; - $z = $nz; - $scan .= qq{}; - } - } - $scan .= q{
TickValueDifference
$tick$x:$y:$z
}; - push @scans, {Scan => $scan}; - - $query = $DBH->prepare(q{SELECT DISTINCT ON (type) type,scan_id, tick, scan FROM scans WHERE planet = ? - GROUP BY type,scan_id, tick, scan ORDER BY type,tick DESC}); - $query->execute($planet_id); - my %scans; - while (my($type,$scan_id,$tick,$scan) = $query->fetchrow){ - $scans{$type} = [$scan_id,$tick,$scan]; - } - for my $type ('Planet','Jumpgate','Unit','Military','Fleet Analysis','Surface Analysis','Technology Analysis','News'){ - next unless exists $scans{$type}; - my $scan_id = $scans{$type}->[0]; - my $tick = $scans{$type}->[1]; - my $scan = $scans{$type}->[2]; - if ($ND::TICK - $tick > 10){ - $scan =~ s{}{}; - } - push @scans,{Scan => qq{ -

$type Scan from tick $tick

-$scan}}; - } - - $BODY->param(Scans => \@scans); -} - -1; diff --git a/covop.pl b/covop.pl deleted file mode 100644 index a07c47f..0000000 --- a/covop.pl +++ /dev/null @@ -1,69 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; - -$ND::TEMPLATE->param(TITLE => 'CovOp Targets'); - -our $BODY; -our $DBH; - -die "You don't have access" unless isMember(); - -my $show = q{AND ((planet_status IS NULL OR NOT planet_status IN ('Friendly','NAP')) AND (relationship IS NULL OR NOT relationship IN ('Friendly','NAP')))}; -$show = '' if defined param('show') && param('show') eq 'all'; -if (defined param('covop') && param('covop') =~ /^(\d+)$/){ - my $update = $DBH->prepare('UPDATE covop_targets SET covop_by = ?, last_covop = tick() WHERE planet = ? '); - $update->execute($ND::UID,$1); -} - -my $list = ''; -my $where = ''; -if (defined param('list') && param('list') eq 'distwhores'){ - $list = '&list=distwhores'; - $where = qq{WHERE dists > 0 $show -ORDER BY dists DESC,COALESCE(sec_centres::float/structures*100,0)ASC} -}else{ - $where = qq{WHERE MaxResHack > 130000 - $show -ORDER BY COALESCE(sec_centres::float/structures*100,0) ASC,MaxResHack DESC,metal+crystal+eonium DESC}; -} - -my $query = $DBH->prepare(qq{SELECT id, coords, metal, crystal, eonium, sec_centres::float/structures*100 AS secs, dists, last_covop, username, MaxResHack -FROM (SELECT p.id,coords(x,y,z), metal,crystal,eonium, - sec_centres,NULLIF(structures,0) AS structures,dists,last_covop, - u.username,max_bank_hack(metal,crystal,eonium,p.value,(SELECT value FROM - current_planet_stats WHERE id = ?)) AS MaxResHack, planet_status, relationship -FROM covop_targets c JOIN current_planet_stats p ON p.id = c.planet - LEFT OUTER JOIN users u ON u.uid = c.covop_by) AS foo - $where}); -$query->execute($ND::PLANET); - -my @targets; -my $i = 0; -while (my ($id,$coords,$metal,$crystal,$eonium,$seccents,$dists,$lastcovop,$user,$max) = $query->fetchrow){ - $i++; - push @targets,{Username => $user, Target => $id, Coords => $coords - , Metal => $metal, Crystal => $crystal, Eonium => $eonium, SecCents => $seccents - , Dists => $dists, MaxResHack => $max, LastCovOp => $lastcovop, List => $list, ODD => $i % 2}; -} -$BODY->param(Targets => \@targets); - -1; diff --git a/editRaid.pl b/editRaid.pl deleted file mode 100644 index 94ed68d..0000000 --- a/editRaid.pl +++ /dev/null @@ -1,196 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Include; -our $BODY; -our $DBH; -my $error; - -$ND::TEMPLATE->param(TITLE => 'Create/Edit Raids'); - -die "You don't have access" unless isBC(); - -my @alliances = alliances(); -$BODY->param(Alliances => \@alliances); - -my $raid; -if (defined param 'raid' and param('raid') =~ /^(\d+)$/){ - my $query = $DBH->prepare(q{SELECT id,tick,waves,message,released_coords,open FROM raids WHERE id = ?}); - $raid = $DBH->selectrow_hashref($query,undef,$1); -} -if (defined param('cmd') && param('cmd') eq 'submit'){ - my $query = $DBH->prepare(q{INSERT INTO raids (tick,waves,message) VALUES(?,?,'')}); - if ($query->execute(param('tick'),param('waves'))){ - $raid = $DBH->last_insert_id(undef,undef,undef,undef,"raids_id_seq"); - my $query = $DBH->prepare(q{SELECT id,tick,waves,message,released_coords,open FROM raids WHERE id = ?}); - $raid = $DBH->selectrow_hashref($query,undef,$raid); - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } -} - -if ($raid && defined param('cmd')){ - if (param('cmd') eq 'remove'){ - $DBH->do(q{UPDATE raids SET open = FALSE, removed = TRUE WHERE id = ?},undef,$raid->{id}); - }elsif (param('cmd') eq 'Open'){ - if($DBH->do(q{UPDATE raids SET open = TRUE, removed = FALSE WHERE id = ?},undef,$raid->{id})){ - $raid->{open} = 1; - $raid->{removed} = 0; - } - }elsif (param('cmd') eq 'Close'){ - if ($DBH->do(q{UPDATE raids SET open = FALSE WHERE id = ?},undef,$raid->{id})){ - $raid->{open} = 0; - } - }elsif (param('cmd') eq 'showcoords'){ - if($DBH->do(q{UPDATE raids SET released_coords = TRUE WHERE id = ?},undef,$raid->{id})){ - $raid->{released_coords} = 1; - } - }elsif (param('cmd') eq 'hidecoords'){ - if($DBH->do(q{UPDATE raids SET released_coords = FALSE WHERE id = ?},undef,$raid->{id})){ - $raid->{released_coords} = 0; - } - }elsif (param('cmd') eq 'comment'){ - $DBH->do(q{UPDATE raid_targets SET comment = ? WHERE id = ?} - ,undef,escapeHTML(param('comment')),param('target')) - or $error .= p($DBH->errstr); - - }elsif (param('cmd') eq 'change'){ - $DBH->begin_work; - my $message = escapeHTML(param('message')); - $raid->{message} = $message; - $raid->{waves} = param('waves'); - $raid->{tick} = param('tick'); - unless ($DBH->do(qq{UPDATE raids SET message = ?, tick = ?, waves = ? WHERE id = ?} - ,undef,$message,param('tick'),param('waves'),$raid->{id})){ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - my $sizelimit = ''; - if (param('sizelimit') =~ /^(\d+)$/){ - $sizelimit = "AND p.size >= $1"; - unless ($DBH->do(qq{DELETE FROM raid_targets WHERE id IN (SELECT t.id FROM current_planet_stats p - JOIN raid_targets t ON p.id = t.planet WHERE p.size < ? AND t.raid = ?)},undef,$1,$raid->{id})){ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - my $targets = param('targets'); - my $addtarget = $DBH->prepare(qq{INSERT INTO raid_targets(raid,planet) ( - SELECT ?, id FROM current_planet_stats p WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE) $sizelimit)}); - while ($targets =~ m/(\d+):(\d+)(?::(\d+))?/g){ - unless ($addtarget->execute($raid->{id},$1,$2,$3)){ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - if (param('alliance') =~ /^(\d+)$/ && $1 != 1){ - log_message $ND::UID,"BC adding alliance $1 to raid"; - my $addtarget = $DBH->prepare(qq{INSERT INTO raid_targets(raid,planet) ( - SELECT ?,id FROM current_planet_stats p WHERE alliance_id = ? $sizelimit)}); - unless ($addtarget->execute($raid->{id},$1)){ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - my $groups = $DBH->prepare('SELECT gid,groupname FROM groups WHERE attack'); - my $delgroup = $DBH->prepare(q{DELETE FROM raid_access WHERE raid = ? AND gid = ?}); - my $addgroup = $DBH->prepare(q{INSERT INTO raid_access (raid,gid) VALUES(?,?)}); - $groups->execute(); - while (my $group = $groups->fetchrow_hashref){ - my $query; - next unless defined param $group->{gid}; - if (param($group->{gid}) eq 'remove'){ - $query = $delgroup; - }elsif(param($group->{gid}) eq 'add'){ - $query = $addgroup; - } - if ($query){ - unless ($query->execute($raid->{id},$group->{gid})){ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - } - unless ($DBH->commit){ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } -} -if ($raid && param('removeTarget')){ - $error .= "test"; - unless($DBH->do(q{DELETE FROM raid_targets WHERE raid = ? AND id = ?} - ,undef,$raid->{id},param('removeTarget'))){ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } -} - -my $groups = $DBH->prepare(q{SELECT g.gid,g.groupname,raid FROM groups g LEFT OUTER JOIN (SELECT gid,raid FROM raid_access WHERE raid = ?) AS ra ON g.gid = ra.gid WHERE g.attack}); -$groups->execute($raid ? $raid->{id} : undef); - -my @addgroups; -my @remgroups; -while (my $group = $groups->fetchrow_hashref){ - if ($group->{raid}){ - push @remgroups,{Id => $group->{gid}, Name => $group->{groupname}}; - }else{ - push @addgroups,{Id => $group->{gid}, Name => $group->{groupname}}; - } -} -$BODY->param(RemoveGroups => \@remgroups); -$BODY->param(AddGroups => \@addgroups); - - -if ($raid){ - - $BODY->param(Raid => $raid->{id}); - if($raid->{open}){ - $BODY->param(Open => 'Close'); - }else{ - $BODY->param(Open => 'Open'); - } - if($raid->{released_coords}){ - $BODY->param(ShowCoords => 'hidecoords'); - $BODY->param(ShowCoordsName => 'Hide'); - }else{ - $BODY->param(ShowCoords => 'showcoords'); - $BODY->param(ShowCoordsName => 'Show'); - } - $BODY->param(Waves => $raid->{waves}); - $BODY->param(LandingTick => $raid->{tick}); - $BODY->param(Message => $raid->{message}); - - my $order = "p.x,p.y,p.z"; - if (param('order') && param('order') =~ /^(score|size|value|xp|race)$/){ - $order = "$1 DESC"; - } - - my $targetquery = $DBH->prepare(qq{SELECT r.id,coords(x,y,z),raid,comment,size,score,value,race,planet_status AS planetstatus,relationship,comment - FROM current_planet_stats p JOIN raid_targets r ON p.id = r.planet - WHERE r.raid = ? - ORDER BY $order}); - $targetquery->execute($raid->{id}) or $error .= $DBH->errstr; - my @targets; - while (my $target = $targetquery->fetchrow_hashref){ - push @targets,$target; - } - $BODY->param(Targets => \@targets); -}else{ - $BODY->param(Waves => 3); - $BODY->param(LandingTick => $ND::TICK+12); -} -$BODY->param(Error => $error); - -1; diff --git a/forum.pl b/forum.pl deleted file mode 100644 index e006b20..0000000 --- a/forum.pl +++ /dev/null @@ -1,150 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -no warnings 'uninitialized'; -use ND::Web::Forum; - -$ND::TEMPLATE->param(TITLE => 'Forum'); - -our $BODY; -our $DBH; -our $ERROR; - - -my $board; -if(param('b')){ -my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post -FROM forum_boards fb NATURAL JOIN forum_access fa -WHERE fb.fbid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers - WHERE uid = $2)) -GROUP BY fb.fbid,fb.board}); - $board = $DBH->selectrow_hashref($boards,undef,param('b'),$ND::UID) or $ERROR .= p($DBH->errstr); -} - -my $thread; -my $findThread = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject, bool_or(fa.post) AS post -FROM forum_boards fb NATURAL JOIN forum_access fa NATURAL JOIN forum_threads ft -WHERE ft.ftid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers - WHERE uid = $2)) -GROUP BY ft.ftid,ft.subject}); -if(param('t')){ - $thread = $DBH->selectrow_hashref($findThread,undef,param('t'),$ND::UID) or $ERROR .= p($DBH->errstr); -} - -if (defined param('cmd') && param('cmd') eq 'forumpost'){ - $DBH->begin_work; - if ($board && $board->{post}){ - $thread = addForumThread $DBH,$board,$ND::UID,param('subject'); - } - if ($thread && $thread->{post}){ - addForumPost($DBH,$thread,$ND::UID,param('message')); - } - $DBH->commit or $ERROR .= p($DBH->errstr); -} - -my $categories = $DBH->prepare(q{SELECT fcid AS id,category FROM forum_categories ORDER BY fcid}); -my $threads = $DBH->prepare(q{SELECT ft.ftid AS id,ft.subject,count(NULLIF(COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread,count(fp.fpid) AS posts, max(fp.time)::timestamp as last_post -FROM forum_threads ft JOIN forum_posts fp USING (ftid) LEFT OUTER JOIN (SELECT * FROM forum_thread_visits WHERE uid = $2) ftv ON ftv.ftid = ft.ftid -WHERE ft.fbid = $1 -GROUP BY ft.ftid, ft.subject -HAVING count(NULLIF(COALESCE(fp.time > ftv.time,TRUE),FALSE)) >= $3 -ORDER BY last_post DESC}); - -if ($thread){ #Display the thread - $BODY->param(Thread => viewForumThread $thread); - -}elsif($board){ #List threads in this board - $BODY->param(Board => $board->{board}); - $BODY->param(Post => $board->{post}); - $BODY->param(Id => $board->{id}); - $threads->execute($board->{id},$ND::UID,0) or $ERROR .= p($DBH->errstr); - my $i = 0; - my @threads; - while (my $thread = $threads->fetchrow_hashref){ - $i++; - $thread->{Odd} = $i % 2; - push @threads,$thread; - } - $BODY->param(Threads => \@threads); - -}elsif(defined param('allUnread')){ #List threads in this board - $BODY->param(AllUnread => 1); - $BODY->param(Id => $board->{id}); - $categories->execute or $ERROR .= p($DBH->errstr); - my @categories; - my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board, bool_or(fa.post) AS post -FROM forum_boards fb NATURAL JOIN forum_access fa -WHERE fb.fcid = $1 AND (gid = -1 OR gid IN (SELECT gid FROM groupmembers - WHERE uid = $2)) -GROUP BY fb.fbid,fb.board -ORDER BY fb.fbid -}); - while (my $category = $categories->fetchrow_hashref){ - $boards->execute($category->{id},$ND::UID) or $ERROR .= p($DBH->errstr); - my @boards; - while (my $board = $boards->fetchrow_hashref){ - $threads->execute($board->{id},$ND::UID,1) or $ERROR .= p($DBH->errstr); - my $i = 0; - my @threads; - while (my $thread = $threads->fetchrow_hashref){ - $i++; - $thread->{Odd} = $i % 2; - push @threads,$thread; - } - $board->{Threads} = \@threads; - delete $board->{post}; - push @boards,$board if $i > 0; - } - $category->{Boards} = \@boards; - delete $category->{id}; - push @categories,$category if @boards; - } - $BODY->param(Categories => \@categories); - -}else{ #List boards - $BODY->param(Overview => 1); - $categories->execute or $ERROR .= p($DBH->errstr); -my $boards = $DBH->prepare(q{SELECT fb.fbid AS id,fb.board,count(NULLIF(COALESCE(fp.fpid::boolean,FALSE) AND COALESCE(fp.time > ftv.time,TRUE),FALSE)) AS unread -FROM forum_boards fb LEFT OUTER JOIN (forum_threads ft JOIN forum_posts fp USING (ftid)) ON fb.fbid = ft.fbid LEFT OUTER JOIN (SELECT * FROM forum_thread_visits WHERE uid = $2) ftv ON ftv.ftid = ft.ftid -WHERE fb.fcid = $1 AND - fb.fbid IN (SELECT fbid FROM forum_access WHERE gid IN (SELECT groups($2))) -GROUP BY fb.fbid, fb.board -ORDER BY fb.fbid }); - my @categories; - while (my $category = $categories->fetchrow_hashref){ - $boards->execute($category->{id},$ND::UID) or $ERROR .= p($DBH->errstr); - my @boards; - my $i = 0; - while (my $board = $boards->fetchrow_hashref){ - $i++; - $board->{Odd} = $i % 2; - push @boards,$board; - } - $category->{Boards} = \@boards; - delete $category->{id}; - push @categories,$category if $i > 0; - } - $BODY->param(Categories => \@categories); - -} - -1; - diff --git a/intel.pl b/intel.pl deleted file mode 100644 index e5ce1e0..0000000 --- a/intel.pl +++ /dev/null @@ -1,225 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Web::Forum; -use ND::Include; - -our $BODY; -our $DBH; -our $ERROR; -my $error; - -$ND::TEMPLATE->param(TITLE => 'Intel'); - -die "You don't have access" unless isIntel() || isHC(); - -my $planet; -if (defined param('coords') && param('coords') =~ /^(\d+)(?: |:)(\d+)(?: |:)(\d+)$/){ - my $query = $DBH->prepare(q{SELECT x,y,z,coords(x,y,z),id, nick, alliance,alliance_id, planet_status,channel,ftid FROM current_planet_stats -WHERE x = ? AND y = ? AND z = ?}); - $planet = $DBH->selectrow_hashref($query,undef,$1,$2,$3) or $ND::ERROR .= p $DBH->errstr; -} - -my $showticks = 'AND (i.tick - i.eta) > (tick() - 48)'; -if (defined param('show')){ - if (param('show') eq 'all'){ - $showticks = ''; - }elsif (param('show') =~ /^(\d+)$/){ - $showticks = "AND (i.tick - i.eta) > (tick() - $1)"; - } -} - -my $thread; -if (defined $planet){ - $thread = $DBH->selectrow_hashref(q{SELECT ftid AS id, subject FROM forum_threads - where ftid = $1},undef,$planet->{ftid}) or $ERROR .= p($DBH->errstr); -} - -if (defined param('cmd') && param('cmd') eq 'coords'){ - my $coords = param('coords'); - $DBH->do(q{CREATE TEMPORARY TABLE coordlist ( - x integer NOT NULL, - y integer NOT NULL, - z integer NOT NULL, - PRIMARY KEY (x,y,z) - )}); - my $insert = $DBH->prepare(q{INSERT INTO coordlist (x,y,z) VALUES(?,?,?)}); - while ($coords =~ m/(\d+):(\d+):(\d+)/g){ - $insert->execute($1,$2,$3); - } - my $planets = $DBH->prepare(q{SELECT (((p.x || ':') || p.y) || ':') || p.z AS coords, alliance FROM current_planet_stats p - JOIN coordlist c ON p.x = c.x AND p.y = c.y AND p.z = c.z -ORDER BY alliance, p.x, p.y, p.z}); - $planets->execute; - my @planets; - while (my $planet = $planets->fetchrow_hashref){ - push @planets,$planet; - } - $BODY->param(CoordList => \@planets); -} -if (defined $thread and defined param('cmd') and param('cmd') eq 'forumpost'){ - addForumPost($DBH,$thread,$ND::UID,param('message')); -} - -if ($planet && defined param('cmd')){ - if (param('cmd') eq 'change'){ - $DBH->begin_work; - if (param('cnick')){ - my $value = escapeHTML(param('nick')); - if ($DBH->do(q{UPDATE planets SET nick = ? WHERE id =?} - ,undef,$value,$planet->{id})){ - intel_log $ND::UID,$planet->{id},"Set nick to: $value"; - $planet->{nick} = $value; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - if (param('cchannel')){ - my $value = escapeHTML(param('channel')); - if ($DBH->do(q{UPDATE planets SET channel = ? WHERE id =?} - ,undef,$value,$planet->{id})){ - intel_log $ND::UID,$planet->{id},"Set channel to: $value"; - $planet->{channel} = $value; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - if (param('cstatus')){ - my $value = escapeHTML(param('status')); - if ($DBH->do(q{UPDATE planets SET planet_status = ? WHERE id =?} - ,undef,$value,$planet->{id})){ - intel_log $ND::UID,$planet->{id},"Set planet_status to: $value"; - $planet->{planet_status} = $value; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - if (param('calliance')){ - if ($DBH->do(q{UPDATE planets SET alliance_id = NULLIF(?,-1) WHERE id =?} - ,undef,param('alliance'),$planet->{id})){ - intel_log $ND::UID,$planet->{id},"Set alliance_id to: ".param('alliance'); - $planet->{alliance_id} = param('alliance'); - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; - } -} - -if (param('coords')){ - my $channel = param('coords'); - $channel = $planet->{channel} if ($planet); - my $findchannel = $DBH->prepare('SELECT coords(x,y,z),alliance,nick,channel FROM current_planet_stats WHERE channel ILIKE ? '); - $findchannel->execute($channel); - my @channelusers; - while (my $user = $findchannel->fetchrow_hashref){ - push @channelusers,$user; - } - $BODY->param(ChannelUsers => \@channelusers); -} - -if ($planet){ - $BODY->param(Coords => $planet->{coords}); - $BODY->param(Planet => $planet->{id}); - $BODY->param(Nick => $planet->{nick}); - $BODY->param(Channel => $planet->{channel}); - my @status; - for my $status (" ","Friendly", "NAP", "Hostile"){ - push @status,{Status => $status, Selected => defined $planet->{planet_status} && $status eq $planet->{planet_status}} - } - $BODY->param(PlanetStatus => \@status); - my @alliances = alliances($planet->{alliance_id}); - $BODY->param(Alliances => \@alliances); - - $BODY->param(Thread => viewForumThread $thread); - - my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin',"t.id = ? $showticks")); - $query->execute($planet->{id}) or $error .= $DBH->errstr; - my @intellists; - my @incomings; - my $i = 0; - while (my $intel = $query->fetchrow_hashref){ - if ($intel->{ingal}){ - $intel->{missionclass} = 'ingal'; - }else{ - $intel->{missionclass} = $intel->{mission}; - } - $i++; - $intel->{ODD} = $i % 2; - push @incomings,$intel; - } - push @intellists,{Message => 'Incoming fleets', Intel => \@incomings, Origin => 1}; - - $query = $DBH->prepare(intelquery('t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',"o.id = ? $showticks")); - $query->execute($planet->{id}) or $error .= $DBH->errstr; - my @outgoings; - $i = 0; - while (my $intel = $query->fetchrow_hashref){ - if ($intel->{ingal}){ - $intel->{missionclass} = 'ingal'; - }else{ - $intel->{missionclass} = $intel->{mission}; - } - $i++; - $intel->{ODD} = $i % 2; - push @outgoings,$intel; - } - push @intellists,{Message => 'Outgoing Fleets', Intel => \@outgoings, Target => 1}; - - $BODY->param(IntelLIsts => \@intellists); - -}elsif(!param('coords')){ - my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin, t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',qq{not ingal - AND ((( t.alliance_id != o.alliance_id OR t.alliance_id IS NULL OR o.alliance_id IS NULL) AND i.mission != 'Attack') - OR ( t.alliance_id = o.alliance_id AND i.mission = 'Attack')) - AND i.sender NOT IN (SELECT planet FROM users u NATURAL JOIN groupmembers gm WHERE gid = 8 AND planet IS NOT NULL) - $showticks})); - $query->execute() or $error .= $DBH->errstr; - - my @intellists; - my @intel; - my $i = 0; - while (my $intel = $query->fetchrow_hashref){ - if ($intel->{ingal}){ - $intel->{missionclass} = 'ingal'; - }else{ - $intel->{missionclass} = $intel->{mission}; - } - $i++; - $intel->{ODD} = $i % 2; - push @intel,$intel; - } - push @intellists,{Message => q{Intel where alliances doesn't match}, Intel => \@intel, Origin => 1, Target => 1}; - $BODY->param(IntelLIsts => \@intellists); -} -my $query = $DBH->prepare(q{SELECT i.id, u.username, i.message, report_date FROM intel_messages i - JOIN users u ON u.uid = i.uid - WHERE NOT handled ORDER BY report_date}); -$query->execute; -my @messages; -while (my $message = $query->fetchrow_hashref){ - $message->{message} = parseMarkup($message->{message}); - push @messages,$message; -} -#$BODY->param(IntelMessages => \@messages); -$BODY->param(Error => $error); -1; diff --git a/launchConfirmation.pl b/launchConfirmation.pl deleted file mode 100644 index ffe6b11..0000000 --- a/launchConfirmation.pl +++ /dev/null @@ -1,120 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Include; - -$ND::TEMPLATE->param(TITLE => 'Launch Confirmation'); - -our $BODY; -our $DBH; -my $error; - - - -die "You don't have access" unless isMember(); - -if (defined param('cmd') && param('cmd') eq 'submit'){ - my $missions = param('mission'); - my $findplanet = $DBH->prepare("SELECT planetid(?,?,?,?)"); - my $findattacktarget = $DBH->prepare(q{SELECT c.target,c.wave,c.launched FROM raid_claims c - JOIN raid_targets t ON c.target = t.id - JOIN raids r ON t.raid = r.id - WHERE c.uid = ? AND r.tick+c.wave-1 = ? AND t.planet = ? - AND r.open AND not r.removed}); - my $finddefensetarget = $DBH->prepare(q{SELECT NULL}); - my $addattackpoint = $DBH->prepare('UPDATE users SET attack_points = attack_points + 1 WHERE uid = ?'); - my $launchedtarget = $DBH->prepare('UPDATE raid_claims SET launched = True WHERE uid = ? AND target = ? AND wave = ?'); - my $addfleet = $DBH->prepare(qq{INSERT INTO fleets (uid,target,mission,landing_tick,fleet,eta,back) VALUES (?,?,?,?,(SELECT max(fleet)+1 from fleets WHERE uid = ?),?,?)}); - my $addships = $DBH->prepare('INSERT INTO fleet_ships (fleet,ship,amount) VALUES (?,?,?)'); - - my $fleet = $DBH->prepare("SELECT id FROM fleets WHERE uid = ? AND fleet = 0"); - my ($basefleet) = $DBH->selectrow_array($fleet,undef,$ND::UID); - unless ($basefleet){ - my $insert = $DBH->prepare(q{INSERT INTO fleets (uid,target,mission,landing_tick,fleet,eta,back) VALUES (?,?,'Full fleet',0,0,0,0)}); - $insert->execute($ND::UID,$ND::PLANET); - } - my @missions; - $DBH->begin_work; - while ($missions =~ m/\S+\s+(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)\s+\((?:(\d+)\+)?(\d+)\).*?(?:\d+hrs\s+)?\d+mins\s+(Attack|Defend|Return|Fake Attack|Fake Defend)(.*?)(?:Launching in tick (\d+), arrival in tick (\d+)|ETA: \d+, Return ETA: (\d+))/sg){ - my %mission; - - my $tick = $ND::TICK+$8; - $tick += $7 if defined $7; - my $eta = $8; - my $mission = $9; - my $x = $4; - my $y = $5; - my $z = $6; - $mission{Tick} = $tick; - $mission{Mission} = $mission; - $mission{Target} = "$x:$y:$z"; - if ($12){ - $tick = $12; - }elsif ($13){ - $eta += $13; - } - - my ($planet_id) = $DBH->selectrow_array($findplanet,undef,$x,$y,$z,$ND::TICK); - - my $findtarget = $finddefensetarget; - if ($mission eq 'Attack'){ - $findtarget = $findattacktarget; - }elsif ($mission eq 'Defend'){ - $findtarget = $finddefensetarget; - } - - $findtarget->execute($ND::UID,$tick,$planet_id); - - if ($findtarget->rows == 0){ - $mission{Warning} = "YOU DON'T HAVE A TARGET WITH THAT LANDING TICK"; - }elsif ($mission eq 'Attack'){ - my $claim = $findtarget->fetchrow_hashref; - if ($claim->{launched}){ - $mission{Warning} = "Already launched on this target:$claim->{target},$claim->{wave},$claim->{launched}"; - }else{ - $addattackpoint->execute($ND::UID); - $launchedtarget->execute($ND::UID,$claim->{target},$claim->{wave}); - $mission{Warning} = "OK:$claim->{target},$claim->{wave},$claim->{launched}"; - log_message $ND::UID,"Gave attack point for confirmation on $mission mission to $x:$y:$z, landing tick $tick"; - } - } - - $addfleet->execute($ND::UID,$planet_id,$mission,$tick,$ND::UID,$eta,$tick+$eta-1) or $error .= '

'.$DBH->errstr.'

'; - my $fleet = $DBH->last_insert_id(undef,undef,undef,undef,"fleets_id_seq"); - $mission{Fleet} = $fleet; - $mission{Back} = $tick+$eta-1; - my $ships = $10; - my @ships; - while ($ships =~ m/((?:\w+ )*\w+)\s+\w+\s+\w+\s+(?:Steal|Normal|Emp|Normal\s+Cloaked|Pod|Struc)\s+(\d+)/g){ - $addships->execute($fleet,$1,$2); - push @ships,{Ship => $1, Amount => $2}; - } - $mission{Ships} = \@ships; - log_message $ND::UID,"Pasted confirmation for $mission mission to $x:$y:$z, landing tick $tick"; - push @missions,\%mission; - } - $DBH->commit or $error .= '

'.$DBH->errstr.'

'; - $BODY->param(Missions => \@missions); -} -$BODY->param(Error => $error); - - -1; diff --git a/main.pl b/main.pl deleted file mode 100644 index 91c347e..0000000 --- a/main.pl +++ /dev/null @@ -1,156 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Include; - -$ND::TEMPLATE->param(TITLE => 'Main Page'); - -our $BODY; -our $DBH; -my $error; - -if (defined param('cmd')){ - if (param('cmd') eq 'fleet'){ - $DBH->begin_work; - my $fleet = $DBH->prepare("SELECT id FROM fleets WHERE uid = ? AND fleet = 0"); - my ($id) = $DBH->selectrow_array($fleet,undef,$ND::UID); - unless ($id){ - my $insert = $DBH->prepare(q{INSERT INTO fleets (uid,target,mission,landing_tick,fleet,eta,back) VALUES (?,?,'Full fleet',0,0,0,0)}); - $insert->execute($ND::UID,$ND::PLANET); - ($id) = $DBH->selectrow_array($fleet,undef,$ND::UID); - } - my $delete = $DBH->prepare("DELETE FROM fleet_ships WHERE fleet = ?"); - $delete->execute($id); - my $insert = $DBH->prepare('INSERT INTO fleet_ships (fleet,ship,amount) VALUES (?,?,?)'); - $fleet = param('fleet'); - $fleet =~ s/,//g; - while ($fleet =~ m/((?:[A-Z][a-z]+ )*[A-Z][a-z]+)\s+(\d+)/g){ - $insert->execute($id,$1,$2) or $error .= '

'.$DBH->errstr.'

'; - } - $fleet = $DBH->prepare('UPDATE fleets SET landing_tick = tick() WHERE id = ?'); - $fleet->execute($id); - $DBH->commit; - }elsif (param('cmd') eq 'Recall Fleets'){ - $DBH->begin_work; - my $updatefleets = $DBH->prepare('UPDATE fleets SET back = tick() + (tick() - (landing_tick - eta)) WHERE uid = ? AND id = ?'); - - for my $param (param()){ - if ($param =~ /^change:(\d+)$/){ - if($updatefleets->execute($ND::UID,$1)){ - log_message $ND::UID,"Member recalled fleet $1"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - } - $DBH->commit or $error .= '

'.$DBH->errstr.'

'; - }elsif (param('cmd') eq 'Change Fleets'){ - $DBH->begin_work; - my $updatefleets = $DBH->prepare('UPDATE fleets SET back = ? WHERE uid = ? AND id = ?'); - for my $param (param()){ - if ($param =~ /^change:(\d+)$/){ - if($updatefleets->execute(param("back:$1"),$ND::UID,$1)){ - log_message $ND::UID,"Member set fleet $1 to be back tick: ".param("back:$1"); - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - } - $DBH->commit or $error .= '

'.$DBH->errstr.'

'; - } -} -if (param('sms')){ - my $query = $DBH->prepare('UPDATE users SET sms = ? WHERE uid = ?'); - $query->execute(escapeHTML(param('sms')),$ND::UID); -} -if (isMember() && !$ND::PLANET && defined param('planet') && (param('planet') =~ m/(\d+)(?: |:)(\d+)(?: |:)(\d+)/)){ - my $query = $DBH->prepare(q{ -UPDATE users SET planet = - (SELECT id from current_planet_stats where x = ? AND y = ? AND z = ?) -WHERE uid = ? }); - $query->execute($1,$2,$3,$ND::UID); -} -if(param('oldpass') && param('pass')){ - my $query = $DBH->prepare('UPDATE users SET password = MD5(?) WHERE password = MD5(?) AND uid = ?'); - $query->execute(param('pass'),param('oldpass'),$ND::UID); -} - -my ($motd) = $DBH->selectrow_array("SELECT value FROM misc WHERE id='MOTD'"); - -$BODY->param(MOTD => parseMarkup($motd)); -$BODY->param(Username => $ND::USER); -$BODY->param(isMember => isMember()); -$BODY->param(isHC => isHC()); -my @groups = map {name => $_}, sort keys %ND::GROUPS; -$BODY->param(Groups => \@groups); - - -my $query = $DBH->prepare(q{SELECT planet,defense_points,attack_points,scan_points,humor_points, (attack_points+defense_points+scan_points/20) as total_points, sms,rank FROM users WHERE uid = ?}); - -my ($planet,$defense_points,$attack_points,$scan_points,$humor_points,$total_points,$sms,$rank) = $DBH->selectrow_array($query,undef,$ND::UID); - -$ND::PLANET = $planet unless $ND::PLANET; - -$BODY->param(NDRank => $rank); -$BODY->param(DefensePoints => $defense_points); -$BODY->param(AttackPoints => $attack_points); -$BODY->param(ScanPoints => $scan_points); -$BODY->param(HumorPoints => $humor_points); -$BODY->param(TotalPoints => $total_points); - -$BODY->param(hasPlanet => $planet); - -if ($planet){ - my @row = $DBH->selectrow_array('SELECT ruler,planet,coords(x,y,z),size,sizerank - ,score,scorerank,value,valuerank,xp,xprank FROM current_planet_stats - WHERE id = ?',undef,$planet); - $BODY->param(PlanetName => "$row[0] OF $row[1] ($row[2])"); - $BODY->param(PlanetSize => "$row[3] ($row[4])"); - $BODY->param(PlanetScore => "$row[5] ($row[6])"); - $BODY->param(PlanetValue => "$row[7] ($row[8])"); - $BODY->param(PlanetXP => "$row[9] ($row[10])"); -} - - -$query = $DBH->prepare(q{SELECT f.fleet,f.id, coords(x,y,z) AS target, mission, sum(fs.amount) AS amount, landing_tick, back -FROM fleets f - JOIN fleet_ships fs ON f.id = fs.fleet - JOIN current_planet_stats p ON f.target = p.id -WHERE f.uid = ? AND (f.fleet = 0 OR back >= ?) -GROUP BY f.fleet,f.id, x,y,z, mission, landing_tick,back -ORDER BY f.fleet -}); - -$query->execute($ND::UID,$ND::TICK) or $error .= '

'.$DBH->errstr.'

'; -my @fleets; -my $i = 0; -while (my $fleet = $query->fetchrow_hashref){ - $i++; - $fleet->{ODD} = $i % 2; - push @fleets,$fleet; -} -$BODY->param(Fleets => \@fleets); - -$BODY->param(SMS => $sms); -$BODY->param(Error => $error); - -1; - diff --git a/memberIntel.pl b/memberIntel.pl deleted file mode 100644 index 66e0dcd..0000000 --- a/memberIntel.pl +++ /dev/null @@ -1,76 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -our $BODY; -our $DBH; -my $error; - -$ND::TEMPLATE->param(TITLE => 'Member Intel'); - -die "You don't have access" unless isHC(); - -my $showticks = 'AND i.tick > tick()'; -if (defined param('show')){ - if (param('show') eq 'all'){ - $showticks = ''; - }elsif (param('show') =~ /^(\d+)$/){ - $showticks = "AND (i.tick - i.eta) > (tick() - $1)"; - } -} - - -my $query = $DBH->prepare(intelquery('o.alliance AS oalliance,coords(o.x,o.y,o.z) AS origin, coords(t.x,t.y,t.z) AS target, t.nick',"t.alliance_id = 1 $showticks")); -$query->execute() or $error .= $DBH->errstr; -my @intellists; -my @incomings; -my $i = 0; -while (my $intel = $query->fetchrow_hashref){ - if ($intel->{ingal}){ - $intel->{missionclass} = 'ingal'; - }else{ - $intel->{missionclass} = $intel->{mission}; - } - $i++; - $intel->{ODD} = $i % 2; - push @incomings,$intel; -} -push @intellists,{Message => 'Incoming fleets', Intel => \@incomings, Origin => 1}; - -$query = $DBH->prepare(intelquery('o.nick,coords(o.x,o.y,o.z) AS origin,t.alliance AS talliance,coords(t.x,t.y,t.z) AS target',"o.alliance_id = 1 $showticks")); -$query->execute() or $error .= $DBH->errstr; -my @outgoings; -$i = 0; -while (my $intel = $query->fetchrow_hashref){ - if ($intel->{ingal}){ - $intel->{missionclass} = 'ingal'; - }else{ - $intel->{missionclass} = $intel->{mission}; - } - $i++; - $intel->{ODD} = $i % 2; - push @outgoings,$intel; -} -push @intellists,{Message => 'Outgoing Fleets', Intel => \@outgoings, Target => 1}; - -$BODY->param(IntelLIsts => \@intellists); - -$BODY->param(Error => $error); -1; diff --git a/pages b/pages deleted file mode 100644 index d03af29..0000000 --- a/pages +++ /dev/null @@ -1,19 +0,0 @@ -main -check -motd -points -covop -top100 -launchConfirmation -addintel -defrequest -raids -editRaid -calls -intel -users -alliances -memberIntel -resources -planetNaps -forum diff --git a/planetNaps.pl b/planetNaps.pl deleted file mode 100644 index ff5a837..0000000 --- a/planetNaps.pl +++ /dev/null @@ -1,46 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; - -$ND::TEMPLATE->param(TITLE => 'List planet naps'); - -our $BODY; -our $DBH; -my $error; - -die "You don't have access" unless isHC(); - - - -my $query = $DBH->prepare(qq{Select coords(x,y,z), ((ruler || ' OF ') || p.planet) as planet,race, size, score, value, xp, sizerank, scorerank, valuerank, xprank, 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, planet_status,hit_us, alliance,relationship,nick from current_planet_stats p LEFT OUTER JOIN covop_targets c ON p.id = c.planet WHERE planet_status IN ('Friendly','NAP') order by x,y,z asc}); - -$query->execute or $error .= p($DBH->errstr); -my @planets; -my $i = 0; -while (my $planet = $query->fetchrow_hashref){ - $i++; - $planet->{ODD} = $i % 2; - push @planets,$planet; -} -$BODY->param(Planets => \@planets); -$BODY->param(Error => $error); - -1; diff --git a/resources.pl b/resources.pl deleted file mode 100644 index fa64c32..0000000 --- a/resources.pl +++ /dev/null @@ -1,59 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -our $BODY; -our $DBH; -my $error; - -$ND::TEMPLATE->param(TITLE => 'Alliance Resources'); - -die "You don't have access" unless isHC(); - -my $order = "respplanet DESC"; -if (defined param('order') && param('order') =~ /^(size|score|resources|respplanet|nscore|nscore2|nscore3)$/){ - $order = "$1 DESC"; -} - - -my $query = $DBH->prepare(qq{ -SELECT a.id,a.name,a.relationship,s.members,s.score,s.size,r.resources,r.planets, resources/planets AS respplanet, - resources / 300 AS scoregain, score + (resources / 300) AS nscore, - (resources/planets*LEAST(members,60))/300 AS scoregain2, score + (resources/planets*LEAST(members,60))/300 AS nscore2, - (s.size::int8*(1464-tick())*250)/100 + score + (resources/planets*LEAST(members,60))/300 AS nscore3, - (s.size::int8*(1464-tick())*250)/100 AS scoregain3 -FROM (SELECT alliance_id AS id,sum(metal+crystal+eonium) AS resources, count(*) AS planets - FROM planets p join covop_targets c ON p.id = c.planet GROUP by alliance_id) r - NATURAL JOIN alliances a - LEFT OUTER JOIN (SELECT * FROM alliance_stats WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON a.id = s.id -ORDER BY $order - }); -$query->execute; -my @alliances; -my $i = 0; -while (my $alliance = $query->fetchrow_hashref){ - $i++; - $alliance->{ODD} = $i % 2; - push @alliances,$alliance; -} -$BODY->param(Alliances => \@alliances); - -$BODY->param(Error => $error); -1; diff --git a/startup.pl b/startup.pl index 30d3163..31d64d6 100644 --- a/startup.pl +++ b/startup.pl @@ -1,21 +1,43 @@ use lib qw(/var/www/ndawn/code/); -use POSIX; use CGI qw/:standard/; use HTML::Template; +use Tie::File; +use POSIX; use Apache::DBI(); DBI->install_driver("Pg"); use DBI; use DBD::Pg qw(:pg_types); +use ND; use ND::DB; use ND::Include; +use ND::Web::AuthHandler; use ND::Web::Include; use ND::Web::Forum; -use Tie::File; +use ND::Web::Pages::Main; +use ND::Web::Pages::AddIntel; +use ND::Web::Pages::Points; +use ND::Web::Pages::LaunchConfirmation; +use ND::Web::Pages::CovOp; +use ND::Web::Pages::Top100; +use ND::Web::Pages::DefRequest; +use ND::Web::Pages::Check; +use ND::Web::Pages::Raids; +use ND::Web::Pages::EditRaid; +use ND::Web::Pages::Calls; +use ND::Web::Pages::Users; +use ND::Web::Pages::Intel; +use ND::Web::Pages::Alliances; +use ND::Web::Pages::MemberIntel; +use ND::Web::Pages::Resources; +use ND::Web::Pages::PlanetNaps; +use ND::Web::Pages::Motd; +use ND::Web::Pages::Forum; + 1; diff --git a/users.pl b/users.pl deleted file mode 100644 index ba87e92..0000000 --- a/users.pl +++ /dev/null @@ -1,133 +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. * -#**************************************************************************/ - -use strict; -use warnings FATAL => 'all'; -use ND::Include; -our $BODY; -our $DBH; - -$ND::TEMPLATE->param(TITLE => 'Users'); - -die "You don't have access" unless isHC(); - -my $error = ''; -my $user; -if (defined param('user') && param('user') =~ /^(\d+)$/){ - my $query = $DBH->prepare(q{ -SELECT uid,username,hostmask,coords(x,y,z) AS planet,attack_points,defense_points,scan_points,humor_points - FROM users u LEFT OUTER JOIN current_planet_stats p ON u.planet = p.id -WHERE uid = ?; -}) or $error .= "

Something went wrong:

"; - $user = $DBH->selectrow_hashref($query,undef,$1) or $error.= "

Something went wrong: ".$DBH->errstr."

"; -} - - -if ($user && defined param('cmd') && param('cmd') eq 'change'){ - $DBH->begin_work; - for my $param (param()){ - if ($param =~ /^c:(\w+)$/){ - my $column = $1; - my $value = param($column); - if ($column eq 'planet'){ - if ($value eq ''){ - $value = undef; - }elsif($value =~ /^(\d+)\D+(\d+)\D+(\d+)$/){ - ($value) = $DBH->selectrow_array(q{SELECT id FROM - current_planet_stats WHERE x = ? and y = ? and z =?} - ,undef,$1,$2,$3); - } - } - if ($DBH->do(qq{UPDATE users SET $column = ? WHERE uid = ? } - ,undef,$value,$user->{uid})){ - $user->{$column} = param($column); - log_message $ND::UID,"HC set $column to $value for user: $user->{uid}"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - } - my $groups = $DBH->prepare('SELECT gid,groupname FROM groups'); - my $delgroup = $DBH->prepare(q{DELETE FROM groupmembers WHERE uid = ? AND gid = ?}); - my $addgroup = $DBH->prepare(q{INSERT INTO groupmembers (uid,gid) VALUES(?,?)}); - $groups->execute(); - while (my $group = $groups->fetchrow_hashref){ - my $query; - next unless defined param($group->{gid}); - if (param($group->{gid}) eq 'remove'){ - $query = $delgroup; - }elsif(param($group->{gid}) eq 'add'){ - $query = $addgroup; - } - if ($query){ - if ($query->execute($user->{uid},$group->{gid})){ - my ($action,$a2) = ('added','to'); - ($action,$a2) = ('removed','from') if param($group->{gid}) eq 'remove'; - log_message $ND::UID,"HC $action user: $user->{uid} ($user->{username}) $a2 group: $group->{gid} ($group->{groupname})"; - }else{ - $error .= "

Something went wrong: ".$DBH->errstr."

"; - } - } - } - $DBH->commit or $error .= "

Something went wrong: ".$DBH->errstr."

"; -} - -if ($user){ - $BODY->param(User => $user->{uid}); - $BODY->param(Username => $user->{username}); - $BODY->param(Hostmask => $user->{hostmask}); - $BODY->param(Planet => $user->{planet}); - $BODY->param(Attack_points => $user->{attack_points}); - $BODY->param(Defense_points => $user->{defense_points}); - $BODY->param(Scan_points => $user->{scan_points}); - $BODY->param(humor_points => $user->{humor_points}); - - my $groups = $DBH->prepare(q{SELECT g.gid,g.groupname,uid FROM groups g LEFT OUTER JOIN (SELECT gid,uid FROM groupmembers WHERE uid = ?) AS gm ON g.gid = gm.gid}); - $groups->execute($user->{uid}); - - my @addgroups; - my @remgroups; -while (my $group = $groups->fetchrow_hashref){ - if ($group->{uid}){ - push @remgroups,{Id => $group->{gid}, Name => $group->{groupname}}; - }else{ - push @addgroups,{Id => $group->{gid}, Name => $group->{groupname}}; - } -} -$BODY->param(RemoveGroups => \@remgroups); -$BODY->param(AddGroups => \@addgroups); - -}else{ - my $query = $DBH->prepare(qq{SELECT u.uid,username,TRIM(',' FROM concat(g.groupname||',')) AS groups - FROM users u LEFT OUTER JOIN (groupmembers gm NATURAL JOIN groups g) ON gm.uid = u.uid - WHERE u.uid > 0 - GROUP BY u.uid,username - ORDER BY username})or $error .= $DBH->errstr; - $query->execute or $error .= $DBH->errstr; - my @users; - my $i = 0; - while (my $user = $query->fetchrow_hashref){ - $i++; - $user->{ODD} = $i % 2; - push @users, $user; - } - $BODY->param(Users => \@users); -} -$BODY->param(Error => $error); -1; -- 2.39.2