X-Git-Url: https://ruin.nu/git/?p=NDIRC.git;a=blobdiff_plain;f=Commands%2FIntel.pm;h=b52d694eddaef305da830f7a1bd96c40435fbd29;hp=b9c00e91d20ebe6085208caca59c53321ea59f66;hb=784ed86eacf5ebed4d3da2ff166b7542ac8f5cd0;hpb=37f76c79c558e1570412e64f99dec3ad407215d2 diff --git a/Commands/Intel.pm b/Commands/Intel.pm index b9c00e9..b52d694 100644 --- a/Commands/Intel.pm +++ b/Commands/Intel.pm @@ -149,4 +149,83 @@ sub setchannel } } +sub newtag + : Help(Usage: .newtag tag | Creates a new tag that can be used with addtag, tags can only contain a-z, A-Z, 0-9 and _) + : ACL(irc_newtag) + : Type(member) +{ + my ($self,$c,$msg) = @_; + my ($tag) = $msg =~ /^(\w+)$/ or die 'ARGS'; + + my $dbh = $c->model; + my $query = $dbh->prepare(q{ +INSERT INTO available_planet_tags (tag) VALUES($1) + }); + eval { + $query->execute($tag); + }; + if ($@ =~ /duplicate key value/){ + $c->reply("$tag already exists"); + return; + }elsif ($@){ + die $@; + } + $c->reply("Added tag $tag"); +} + +sub addtag + : Help(Usage: .addtag X:Y:Z tag | Adds the tag to planet X:Y:Z) + : ACL(irc_addtag) + : Type(member) +{ + my ($self,$c,$msg) = @_; + my ($x,$y,$z,$tag) = $msg =~ /^(\d+)\D+(\d+)\D+(\d+)\s+(\S+)$/ or die 'ARGS'; + my $dbh = $c->model; + + my $query = $dbh->prepare(q{ +INSERT INTO planet_tags (uid,pid,tag) VALUES($1,planetid($2,$3,$4,tick()),$5) + }); + eval { + $query->execute($c->uid,$x,$y,$z,$tag); + }; + given ($@){ + when(''){ + $c->reply("Added tag $tag to $x:$y:$z"); + }when (/duplicate key value/){ + $c->reply("$x:$y:$z already has tag $tag"); + }when (/null value in column "pid"/){ + $c->reply("No planet with coords $x:$y:$z"); + }when ($@ =~ /foreign key constraint "planet_tags_tag_fkey"/){ + $query = $dbh->prepare(q{ +SELECT array_to_string(array_agg(tag),' ') +FROM (SELECT tag FROM available_planet_tags + WHERE tag % $1 ORDER BY similarity(tag,$1) DESC) t + }); + my ($tags) = $dbh->selectrow_array($query,undef,$tag); + $c->reply("$tag is not a valid tag. Either you need to add it with .newtag," + ." or you want one of: $tags"); + } + default { + die $@; + } + } +} + +sub deltag + : Help(Usage: .deltag X:Y:Z tag | Removes the tag from planet X:Y:Z) + : ACL(irc_addtag) + : Type(member) +{ + my ($self,$c,$msg) = @_; + my ($x,$y,$z,$tag) = $msg =~ /^(\d+)\D+(\d+)\D+(\d+)\s+(\S+)$/ or die 'ARGS'; + my $dbh = $c->model; + + my $query = $dbh->prepare(q{ +DELETE FROM planet_tags WHERE uid = $1 AND pid = planetid($2,$3,$4,tick()) AND tag LIKE $5 + }); + $query->execute($c->uid,$x,$y,$z,$tag); + my $rows = $query->rows; + $c->reply("Removed $rows matching $tag from $x:$y:$z"); +} + 1;