X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=Commands%2FDef.pm;h=1731689e12689e673d06cec3e0d1543e9acbb80c;hb=ae37bc6b64270f8c65298a36fce1f4bad761231f;hp=7931033e2f6ddd1ba1cf1b04372dff5bb5fbaef0;hpb=565ece6e27fa54253934518cc8c69ecfac9487e4;p=NDIRC.git diff --git a/Commands/Def.pm b/Commands/Def.pm index 7931033..1731689 100644 --- a/Commands/Def.pm +++ b/Commands/Def.pm @@ -23,6 +23,8 @@ use strict; use warnings; use feature ':5.10'; +use CGI; + use Moose; use MooseX::MethodAttributes; @@ -39,5 +41,190 @@ sub anon $c->message("msg ".$c->channel, "$target << $mess"); } +sub defcall + : Help(syntax: .defcall [callid] | if a call id is given, then shiptypes and eta will be fetched from the database and added to the message) + : Type(def) + : ACL(irc_defcall) +{ + my ($self,$c,$msg) = @_; + my ($callnr,$mess) = $msg =~ /^(\d+)?(.*)$/ or die 'ARGS'; + my $dbh = $c->model; + + my $callinfo = ""; + if ($callnr){ + my $st = $dbh->prepare(q{ +SELECT status + ,c.landing_tick - (SELECT value::integer FROM misc WHERE id = 'TICK') AS eta + ,concat(i.shiptype||'/') AS shiptype +FROM calls c + JOIN incomings i USING (call) + LEFT OUTER JOIN users dc ON dc.uid = c.dc +WHERE c.call = ? +GROUP BY c.call,c.landing_tick,c.status +ORDER BY c.landing_tick; + }); + my $call = $dbh->selectrow_hashref($st,undef,$callnr); + unless (defined $call->{status}){ + $c->reply("No call with id: $callnr"); + return; + } + chop($call->{shiptype}); + $callinfo = "(Anti $call->{shiptype} ETA: $call->{eta})"; + if($call->{status} eq 'Covered'){ + $c->reply("Call $callnr $callinfo is covered."); + return; + } + } + $c->message("notice $ND::memchan", "DEFENSE REQUIRED!! WAKE UP!!"); + $c->message("msg $ND::memchan", "DEFENSE REQUIRED $mess $callinfo MSG " + .$c->nick." TO RESPOND"); +} + +sub settype + : Help(Usage: .settype incId type | or: .settyp callId X:Y:Z type | or: .settypeall callId type) + : Type(def) + : ACL(irc_settype) + : Alias(settypeall) +{ + my ($self,$c,$msg) = @_; + my $dbh = $c->model; + + my $query = q{ +SELECT inc,call,shiptype, coords(x,y,z),c.landing_tick - tick() AS eta +FROM incomings i + JOIN current_planet_stats p USING (pid) + JOIN calls c USING (call) + }; + my $fleets; + my $type; + my $call; + + if ($self->name eq 'settypeall'){ + ($call,$type) = $msg =~ /^(\d+) (.*)$/ or die 'ARGS'; + + $fleets = $dbh->prepare($query . q{ +WHERE call = ? + }); + $fleets->execute($call); + }else{ + my ($id,$x,$y,$z,$t) = $msg =~ /^(\d+) (\d+):(\d+):(\d+) (.*)$/; + if (defined $id){ + $fleets = $dbh->prepare($query . q{ +WHERE call = ? AND pid = planetid(?,?,?,tick()) + }); + $fleets->execute($id,$x,$y,$z); + }else{ + ($id,$t) = $msg =~ /^(\d+) (.*)$/ or die 'ARGS'; + $fleets = $dbh->prepare($query . q{ +WHERE inc = ? + }); + $fleets->execute($id); + } + $type = $t; + } + + $type = CGI::escapeHTML($type); + $dbh->begin_work; + my $deflog = ''; + my $settype = $dbh->prepare(q{UPDATE incomings SET shiptype = ? WHERE inc = ?}); + while (my $inc = $fleets->fetchrow_hashref){ + $call //= $inc->{call}; + if ($inc->{eta} < 0){ + $c->reply("This call is old. Did you use the call id instead of inc id by" + ." accident? You can use .settypeall callid to set the type on all incs" + ." in a call. Or use webbie if you really want to update this old call."); + $dbh->rollback; + return; + } + $settype->execute($type,$inc->{inc}); + $deflog .= "Set fleet: [B]$inc->{inc} [/B] to: [B]$type [/B]\n"; + $c->reply("Set fleet $inc->{inc} from $inc->{coords} on call $call to $type (previously $inc->{shiptype})"); + } + if ($fleets->rows == 0){ + $c->reply("No matching fleets"); + $dbh->rollback; + }else{ + $c->def_log($call,$deflog); + $dbh->commit; + } +} + +sub calltake + : Help(Usage: .calltake callid | sets the dc. also markes as covered/ignored with .callcov and .callignore) + : Type(def) + : ACL(irc_calltake) + : Alias(qw/callcov callignore/) +{ + my ($self,$c,$msg) = @_; + my ($id) = $msg =~ /^(\d+)$/ or die 'ARGS'; + my $dbh = $c->model; + + my $status = 'Open'; + + given ($self->{name}){ + when('callignore'){ + $status = 'Ignored'; + } + when('callcov'){ + $status = 'Covered'; + } + } + + $dbh->begin_work; + my $rows = $dbh->do(q{ +UPDATE calls SET dc = (SELECT uid FROM users WHERE hostmask ILIKE $1) + ,status = $3 +WHERE call = $2 + },undef,$c->host,$id,$status); + if ($rows == 1){ + $c->reply("Setting status on call $id to $status"); + $c->def_log($id , "Changed status: [B]$status [/B]"); + $dbh->commit; + }else{ + $c->reply("$id is not a valid call"); + $dbh->rollback; + } +} + +sub setcalc + : Help(Usage: .setcalc callId calc | sets the calc for the given call.) + : Type(def) + : ACL(irc_setcalc) +{ + my ($self,$c,$msg) = @_; + my ($id,$calc) = $msg =~ /^(\d+) (.+)$/ or die 'ARGS'; + my $dbh = $c->model; + + $dbh->begin_work; + my $rows = $dbh->do(q{UPDATE calls SET calc = $2 WHERE id = $1} + ,undef,$id, $calc); + if ($rows == 1){ + $c->reply("Updated calc call $id"); + $calc = CGI::escapeHTML($calc); + $c->def_log($id , 'Updated calc to: [URL]'.$calc.'[/URL]'); + $dbh->commit; + }else{ + $c->reply("$id is not a valid call"); + $dbh->rollback; + } +} + +sub getcalc + : Help(Usage: .getcalc callId | receives the calc for the given call) + : Type(def) + : ACL(irc_getcalc) +{ + my ($self,$c,$msg) = @_; + my ($id) = $msg =~ /^(\d+)$/ or die 'ARGS'; + my $dbh = $c->model; + + my $calc = $dbh->selectrow_array(q{ +SELECT calc FROM calls WHERE id = $1} + ,undef,$id); + $calc //= "Bad call id, there is no such call."; + $c->reply("Calc for call $id: $calc"); +} + + 1;