+ }
+};
+
+command g => {
+ help => q(usage: .g X:Y),
+}, class extends NDIRC::Command {
+ method execute($c,$msg) {
+
+ my ($x,$y) = ($msg =~ /(\d+)\D+(\d+)/) or die 'ARGS';
+ my $dbh = $c->model;
+
+ my $f = $dbh->prepare(q{
+ SELECT score,scorerank,size,sizerank,value,valuerank,planets
+ FROM galaxies WHERE x = ? AND y = ? AND tick = (SELECT max(tick) from galaxies)
+ });
+ $f->execute($x,$y);
+ my @row = $f->fetchrow;
+ unless (@row){
+ $c->reply("No galaxy at $x:$y");
+ return;
+ }
+ my @planets;
+ if ($c->check_user_roles(qw/irc_g_intel/)) {
+ my $query = $dbh->prepare(q{
+SELECT z,COALESCE(nick,'?') AS nick,COALESCE(alliance,'?') AS alliance
+FROM current_planet_stats
+WHERE x = $1 AND y = $2 ORDER BY z
+ });
+ $query->execute($x,$y);
+ while(my $p = $query->fetchrow_hashref){
+ push @planets, "$p->{z} [$p->{nick}/$p->{alliance}]";
+ }
+ }
+ @row = map ($c->valuecolor(1),@row);
+ $c->reply("$x:$y Score=$row[0] ($row[1]), Size=$row[2] ($row[3]), Value=$row[4] ($row[5]), Planets=$row[6] - "
+ . join " ", @planets);
+ }
+};
+
+command time => {
+ help => q(syntax: .time [tick] [timezone] | Gives the time at the specied tick. Assumes GMT if no timezone is given and current tick if no tick is given.),
+}, class extends NDIRC::Command {
+ method execute($c,$msg) {
+ my ($tick,$timezone) = $msg =~ /^(\d+)?\s*(\S+)?$/ or die 'ARGS';
+
+ eval {
+ $tick //= $c->model->selectrow_array(q{SELECT tick()});
+ $timezone //= 'GMT';
+ my $query = $c->model->prepare(q{
+SELECT date_trunc('seconds',now() + (($1 - tick()) || ' hr')::interval) AT TIME ZONE $2
+ });
+ $query->execute($tick,$timezone);
+ my $time = $query->fetchrow_array;
+ $c->reply("Time at tick <b>$tick</b>, timezone <b>$timezone</b>: <b>$time</b>");
+ };
+ given ($@){
+ when(/time zone "(.+?)" not recognized/){
+ $c->reply("<c04>$1</c> is not a valid timezone.");
+ }
+ die $@ if $@;
+ }
+ }
+};
+
+command xp => {
+ help => q(syntax: .xp X:Y:Z [roids] [cap] | if roids < 10 then it's taken as the wave, cap is a floating point number, defaults to cap according to your value),
+}, class extends NDIRC::Command {
+ use POSIX qw/pow/;
+ use ND::Include;
+ method execute($c,$msg) {
+
+ my ($x,$y,$z,$roids,$cap) = $msg =~ /^(\d+)\D+(\d+)\D+(\d+)(?:[^\.\d]+(\d+))?(?:[^\.\d]+(\d*\.\d+))?$/
+ or die 'ARGS';
+
+ my ($avalue,$ascore) = $c->model->selectrow_array(q{
+SELECT value,score FROM current_planet_stats
+WHERE pid = (SELECT pid FROM users WHERE uid = ?)
+ }, undef, $c->uid);
+ my ($tvalue,$tscore,$tsize) = $c->model->selectrow_array(q{
+SELECT value,score,size FROM current_planet_stats
+WHERE x = ? AND y = ? and z = ?
+ }, undef, $x,$y,$z);
+ $cap //= min(0.25,0.25 * pow($tvalue/$avalue , 0.5));
+ unless($roids){
+ $roids = int($tsize*$cap);
+ }elsif ($roids < 10){
+ $tsize = int($tsize*.75**($roids-1));
+ $roids = int($cap*$tsize);
+ }
+ $tsize -= $roids;
+ unless (defined $avalue && defined $ascore){
+ $c->reply("You don't have a planet specified");
+ return;
+ }
+ unless (defined $tvalue && defined $tscore){
+ $c->reply("No planet found at $x:$y:$z");
+ return;
+ }
+ my $xp = pa_xp($roids,$ascore,$avalue,$tscore,$tvalue);
+ my $score = 60 * $xp;
+ my $value = $roids*200;
+ my $totscore = prettyValue($score + $value);
+ $cap = sprintf "%.1f", $cap*100;
+ $c->reply("You will gain <b>$xp</b> XP, <b>$score</b> score, if you steal <b>$roids</b> roids (<b>$value</b> value, <b>$cap%</b> cap), from <b>$x:$y:$z</b>, who will have <b>$tsize</b> roids left, total score gain will be: <b>$totscore</b> in total,");
+ }
+};
+
+command fco => {
+ help => q(syntax: .fco agents stolen [tick] | tick can be omitted if you're doing this the same tick you got cov opped, if you have different amount of your resources stolen, specify the highest amount. Only works if less than 10% of your resources and < 10,000*agents were stolen),
+}, class extends NDIRC::Command {
+ method execute($c,$msg) {
+
+ my ($agents,$stolen,$tick) = $msg =~ /^(\d+)\s+(\d+)\s*(\d+)?$/ or die 'ARGS';
+
+ $tick //= $c->model->selectrow_array(q{SELECT tick()});
+
+ my ($value,$score) = $c->model->selectrow_array(q{
+SELECT value,score FROM planet_stats WHERE tick = $2 AND
+ pid = (SELECT pid FROM users WHERE uid = $1)
+ }, undef, $c->uid,$tick);
+ unless ($value){
+ $c->reply("You don't have a planet registered.");
+ return;
+ }
+ my $attackers = $c->model->prepare(q{
+SELECT coords(p.x,p.y,p.z), ruler, planet FROM current_planet_stats p
+ JOIN planet_stats ps using (pid)
+WHERE ps.tick = $1 AND trunc(2000.0*$2*$3/ps.value)::int = $4
+ });
+ $attackers->execute($tick,$agents,$value,$stolen);
+ if ($attackers->rows == 0){
+ $c->reply("No cov opper found, did you specify the right tick, and was the stolen amount not capped?");