X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=lib%2FNDWeb%2FController%2FMembers.pm;h=164a0d98e8c7693d5da2e0b6c0b10ab2ecb8a3c8;hb=7d478421939145912a4155865ad6b521e1bff08f;hp=6dcc1f67e5f3563fd440a23579f09ab9c63fd0f3;hpb=b52c7c95096825846f53e73de627e6cda01d9bca;p=ndwebbie.git diff --git a/lib/NDWeb/Controller/Members.pm b/lib/NDWeb/Controller/Members.pm index 6dcc1f6..164a0d9 100644 --- a/lib/NDWeb/Controller/Members.pm +++ b/lib/NDWeb/Controller/Members.pm @@ -82,25 +82,35 @@ sub index : Path : Args(0) { $calls->execute($c->user->id); $c->stash(calls => $calls->fetchall_arrayref({}) ); - my $query = $dbh->prepare(q{SELECT f.id, coords(x,y,z), target, mission - , f.amount, tick, back -FROM fleets f -LEFT OUTER JOIN current_planet_stats p ON f.target = p.id -WHERE NOT ingal AND f.uid = ? AND f.sender = ? AND - (back >= ? OR (tick >= tick() - 24 AND name = 'Main')) -GROUP BY f.id, x,y,z, mission, tick,back,f.amount,f.target -ORDER BY x,y,z,mission,tick + my $query = $dbh->prepare(q{ +( + SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta + ,amount, NULL AS coords, planet AS target, NULL AS back + FROM fleets f + JOIN full_fleets USING (fid) + WHERE uid = $1 AND planet = $2 AND tick >= tick() - 24 + AND name = 'Main' AND mission = 'Full fleet' + ORDER BY mission,name,tick DESC +) UNION ( + SELECT fid,mission,name,landing_tick AS tick, eta, amount + , coords(x,y,z), target, back + FROM fleets f + JOIN launch_confirmations USING (fid) + LEFT OUTER JOIN current_planet_stats t ON target = t.id + WHERE uid = $1 AND f.planet = $2 AND back >= tick() + AND landing_tick - eta - 12 < tick() +) }); my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships - WHERe id = ? ORDER BY num + WHERE fid = ? ORDER BY num }); - $query->execute($c->user->id,$c->user->planet,$c->stash->{TICK}); + $query->execute($c->user->id,$c->user->planet); my @fleets; while (my $fleet = $query->fetchrow_hashref){ my @ships; - $ships->execute($fleet->{id}); + $ships->execute($fleet->{fid}); while (my $ship = $ships->fetchrow_hashref){ push @ships,$ship; } @@ -185,16 +195,19 @@ sub postfleetupdate : Local { $dbh->begin_work; eval{ my $insert = $dbh->prepare(q{INSERT INTO fleets - (uid,sender,name,mission,tick,amount) - VALUES (?,?,'Main','Full fleet',tick(),?) RETURNING id}); - my ($id) = $dbh->selectrow_array($insert,undef,$c->user->id + (planet,name,mission,tick,amount) + VALUES (?,'Main','Full fleet',tick(),?) RETURNING fid}); + my ($id) = $dbh->selectrow_array($insert,undef ,$c->user->planet,$amount); $insert = $dbh->prepare(q{INSERT INTO fleet_ships - (id,ship,amount) VALUES (?,?,?)}); + (fid,ship,amount) VALUES (?,?,?)}); for my $s (@ships){ unshift @{$s},$id; $insert->execute(@{$s}); } + $insert = $dbh->prepare(q{INSERT INTO full_fleets + (fid,uid) VALUES (?,?)}); + $insert->execute($id,$c->user->id); $dbh->commit; }; if ($@){ @@ -221,9 +234,9 @@ sub postfleetsupdates : Local { }); $dbh->begin_work; if ($c->req->param('cmd') eq 'Recall Fleets'){ - my $updatefleets = $dbh->prepare(q{UPDATE fleets - SET back = tick() + (tick() - (tick - eta)) - WHERE uid = ? AND id = ? AND back > tick()+eta + my $updatefleets = $dbh->prepare(q{UPDATE launch_confirmations + SET back = tick() + (tick() - (landing_tick - eta)) + WHERE uid = ? AND fid = ? AND back > tick()+eta }); for my $param ($c->req->param()){ @@ -233,8 +246,8 @@ sub postfleetsupdates : Local { } } }elsif ($c->req->param('cmd') eq 'Change Fleets'){ - my $updatefleets = $dbh->prepare(q{UPDATE fleets - SET back = ? WHERE uid = ? AND id = ?}); + my $updatefleets = $dbh->prepare(q{UPDATE launch_confirmations + SET back = ? WHERE uid = ? AND fid = ?}); for my $param ($c->req->param()){ if ($param =~ /^change:(\d+)$/){ @@ -370,7 +383,7 @@ sub insertintel : Private { unless ($tick =~ /^(\d+)$/){ $tick = $c->stash->{game}->{tick}; } - my $addintel = $dbh->prepare(q{INSERT INTO fleets + my $addintel = $dbh->prepare(q{INSERT INTO intel (name,mission,tick,target,sender,eta,amount,ingal,back,uid) VALUES($1,$2,$3,planetid($4,$5,$6,$10),planetid($7,$8,$9,$10) ,$11,$12,$13,$14,$15) @@ -399,6 +412,7 @@ sub insertintel : Private { sub launchConfirmation : Local { my ( $self, $c ) = @_; + $c->stash(error => $c->flash->{error}); $c->stash(missions => $c->flash->{missions}); } @@ -430,11 +444,14 @@ sub postconfirmation : Local { WHERE uid = ? AND target = ? AND wave = ? }); my $addfleet = $dbh->prepare(q{INSERT INTO fleets - (uid,name,mission,sender,target,tick,eta,back,amount) - VALUES ($1,$2,$3,(SELECT planet FROM users WHERE uid = $1),$4,$5,$6,$7,$8) - RETURNING id + (name,mission,planet,tick,amount) + VALUES ($2,$3,(SELECT planet FROM users WHERE uid = $1),tick(),$4) + RETURNING fid + }); + my $addconfirmation = $dbh->prepare(q{INSERT INTO launch_confirmations + (fid,uid,target,landing_tick,eta,back) VALUES ($1,$2,$3,$4,$5,$6) }); - my $addships = $dbh->prepare(q{INSERT INTO fleet_ships (id,ship,amount) + my $addships = $dbh->prepare(q{INSERT INTO fleet_ships (fid,ship,amount) VALUES (?,?,?) }); my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES( @@ -455,17 +472,14 @@ sub postconfirmation : Local { my $name = $1; my $tick = $c->stash->{TICK}+$9; $tick += $8 if defined $8; + $tick = $13 if defined $13; my $eta = $9; + $eta += $14 if defined $14; my $mission = $10; my $x = $5; my $y = $6; my $z = $7; my $back = $tick + $eta - 1; - if ($13){ - $tick = $13; - }elsif ($14){ - $back += $14; - } $mission{tick} = $tick; $mission{mission} = $mission; $mission{target} = "$x:$y:$z"; @@ -495,8 +509,9 @@ sub postconfirmation : Local { warn "No ships in: $ships"; next; } - my $fleet = $dbh->selectrow_array($addfleet,undef,$c->user->id,$name,$mission - ,$planet_id,$tick,$eta,$back,$amount); + my $fleet = $dbh->selectrow_array($addfleet,undef,$c->user->id,$name + ,$mission,$amount); + $addconfirmation->execute($fleet,$c->user->id,$planet_id,$tick,$eta,$back); $mission{fleet} = $fleet; for my $ship (@ships){ $addships->execute($fleet,$ship->{ship},$ship->{amount}); @@ -527,7 +542,11 @@ sub postconfirmation : Local { }; if ($@){ $dbh->rollback; - die $@; + if ($@ =~ m/insert or update on table "fleet_ships" violates foreign key constraint "fleet_ships_ship_fkey"\s+DETAIL:\s+Key \(ship\)=\(([^)]+)\)/){ + $c->flash( error => "'$1' is NOT a valid ship"); + }else{ + $c->flash( error => $@); + } } $c->res->redirect($c->uri_for('launchConfirmation'));