my $f = $dbh->prepare(q{
SELECT username,SUM(fs.amount) AS amount
FROM users u
- JOIN (SELECT DISTINCT ON (planet) planet,fid FROM fleets
+ JOIN (SELECT DISTINCT ON (pid) pid,fid FROM fleets
WHERE mission = 'Full fleet' AND name <> 'Unit'
- ORDER BY planet,tick DESC,fid DESC
- ) f USING (planet)
+ ORDER BY pid,tick DESC,fid DESC
+ ) f USING (pid)
JOIN fleet_ships fs USING (fid)
WHERE ship ILIKE $1 AND uid IN (SELECT uid FROM groupmembers WHERE gid = 2)
GROUP BY username ORDER BY amount DESC
FROM fleet_ships fs
JOIN (SELECT fid,username
FROM fleets f
- JOIN users u USING (planet)
+ JOIN users u USING (pid)
WHERE mission = 'Full fleet' AND name <> 'Unit'
AND username ILIKE $1
- ORDER BY planet,tick DESC,fid DESC
+ ORDER BY pid,tick DESC,fid DESC
LIMIT 1
) f USING (fid)
ORDER BY num
$f->finish;
}
+sub a
+ : Help(Usage: .a username [points] | % can be used for wildcards %arro% will match barrow, if the number of points isn't specified, then 1 will be assumed.)
+ : ACL(irc_a)
+{
+ my ($self,$c,$msg) = @_;
+ my ($nick,$points) = $msg =~ /^(\S+)(?: (-?(:?\d+|\d*\.\d+)))?$/ or die 'ARGS';
+ $points //= 1;
+
+ my ($fleets) = $c->model->selectrow_array(q{
+SELECT count(*) FROM raids r
+ JOIN raid_targets rt ON r.id = rt.raid
+ JOIN raid_claims rc ON rt.id = rc.target
+WHERE not launched AND tick + 24 > tick()
+ AND uid = (SELECT uid FROM users WHERE username ILIKE $1);
+ },undef,$nick);
+
+ if ($fleets > 0 && $points > 0){
+ $c->reply("$nick has $fleets claimed waves the last 24 ticks that aren't marked as launched, so no points.");
+ return;
+ }
+ addPoints($c, 'attack', $nick, $points);
+}
+
+sub d
+ : Help(Usage: .d username [points] | % can be used for wildcards %arro% will match barrow, if the number of points isn't specified, then 1 will be assumed.)
+ : ACL(irc_d)
+ : Type(def)
+{
+ my ($self,$c,$msg) = @_;
+ my ($nick,$points) = $msg =~ /^(\S+)(?: (-?(:?\d+|\d*\.\d+)))?$/ or die 'ARGS';
+
+ addPoints($c, 'defense', $nick, $points);
+}
+
+sub s
+ : Help(Usage: .s username [points] | % can be used for wildcards %arro% will match barrow, if the number of points isn't specified, then 1 will be assumed.)
+ : ACL(irc_s)
+{
+ my ($self,$c,$msg) = @_;
+ my ($nick,$points) = $msg =~ /^(\S+)(?: (-?(:?\d+|\d*\.\d+)))?$/ or die 'ARGS';
+
+ addPoints($c, 'scan', $nick, $points);
+}
+
+sub h
+ : Help(Usage: .h username [points] | % can be used for wildcards %arro% will match barrow, if the number of points isn't specified, then 1 will be assumed.)
+ : ACL(irc_h)
+{
+ my ($self,$c,$msg) = @_;
+ my ($nick,$points) = $msg =~ /^(\S+)(?: (-?(:?\d+|\d*\.\d+)))?$/ or die 'ARGS';
+
+ addPoints($c, 'humor', $nick, $points);
+}
+
+sub addPoints {
+ my ($c,$type, $nick, $points) = @_;
+ $points //= 1;
+
+ my $dbh = $c->model;
+
+ if ($points*$points > 400){
+ $c->reply("Values between -20 and 20 please");
+ return;
+ }
+
+ my $f = $dbh->prepare(q{SELECT uid,username FROM users WHERE username ILIKE ?});
+ $f->execute($nick);
+ my $user = $f->fetchrow_hashref;
+ if ($f->rows == 1){
+ $type .= "_points";
+ $dbh->do(qq{UPDATE users SET $type = $type + ? WHERE uid = ?}
+ ,undef,$points,$user->{uid});
+ $c->reply("$user->{username} has been given $points $type");
+ }elsif ($f->rows == 0){
+ $c->reply("No hit, maybe spelling mistake, or add % as wildcard");
+ }else{
+ $c->reply("More than 1 user matched, please refine the search");
+ }
+ $f->finish;
+}
+
1;