]> ruin.nu Git - NDIRC.git/blobdiff - Commands/Quotes.pm
Move quotes to database
[NDIRC.git] / Commands / Quotes.pm
index c2625a8b12fa10491d93414bfa3c071a3d1080d2..7c0f669f20ace34fbb9f24db1dd1295971419d78 100644 (file)
 #   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
 #**************************************************************************/
 
-package NDIRC::Commands::Quotes;
-
 use strict;
 use warnings;
 use feature ':5.10';
 
-use Moose;
-use MooseX::MethodAttributes;
-
-use Tie::File;
-use File::Temp ();
-
-tie my @FILE, 'Tie::File', "quote.txt";
-tie my @OLDFILE, 'Tie::File',"oldquotes.txt" or die "test";
-
-sub quote
-       : Help(syntax .quote [number] | if number isn't given, then a random quote is used)
-       : Alias(lastquote)
-{
-       my ($self,$c,$msg) = @_;
-       my ($n) = $msg =~ /(\d+)/;
+use MooseX::Declare;
+use NDIRC::Dispatcher;
 
-       $n = $n-1 if defined $n;
-       $n //= int(rand($#FILE));
-       $n = $#FILE if $self->name eq 'lastquote';
 
-       my $text = $FILE[$n];
-       $text =~ s/(.*?)[\r\n]*$/$1/;
-       $n++;
-       my $num = $#FILE+1;
-       $c->reply("Quote <b>$n</b> of <b>$num</b>: $text");
-}
-
-sub addquote
-       : Help(syntax .addquote quote)
-{
-       my ($self,$c,$quote) = @_;
+command quote => {
+       help => q(syntax .quote [number|search term] | if number/search term isn't given, then a random quote is used),
+       alias => q(lastquote),
+}, class extends NDIRC::Command {
+       method execute($c,$msg) {
+               my $dbh = $c->model;
+               my $quote;
+               if ($msg =~ /(\d+)/) {
+                       my $quote = $dbh->selectrow_hashref(q{SELECT qid,quote FROM quotes WHERE qid = ?},  undef, $1);
+                       if ($quote) {
+                               $c->reply("Quote <b>$quote->{qid}</b>: $quote->{quote}");
+                       } else {
+                               $c->reply("No quote with id <b>$1</b>");
+                       }
+               } elsif ($msg =~ /^\s*(.+?)\s*$/) {
+                       say $1;
+                       my $quote = $dbh->selectrow_hashref(q{
+SELECT qid,quote FROM quotes
+WHERE quote ILIKE '%' || $1 || '%' ORDER BY random() limit 1
+                               },  undef, $1);
+                       if ($quote) {
+                               $c->reply("Quote <b>$quote->{qid}</b>: $quote->{quote}");
+                       } else {
+                               $c->reply("No quote matching <b>$1</b>");
+                       }
+               } else {
+                       say "default";
+                       my $quote = $dbh->selectrow_hashref(q{
+SELECT qid,quote FROM quotes tablesample system(5) ORDER BY random() LIMIT 1
+                               });
+                       $c->reply("Quote <b>$quote->{qid}</b>: $quote->{quote}");
+               }
+       }
+};
 
-       die 'ARGS' unless $quote;
+command addquote => {
+       help => q(syntax .addquote quote),
+}, class extends NDIRC::Command {
+       method execute($c,$msg) {
 
-       push @FILE, $quote;
-       my $num = $#FILE+1;
-       $c->reply("Quote <b>$num</b> added");
-}
+               my ($quote) = $msg =~ /^\s*(.+?)\s*$/ or die 'ARGS';
 
-sub findquote
-       : Help(syntax .findquote pattern | findqre lets you use a regex pattern)
-       : Alias(findqre)
-{
-       my ($self,$c,$pattern) = @_;
-       die 'ARGS' unless $pattern;
-       my $matcher;
-       if ($self->name eq 'findqre'){
-               if (defined (eval 'm/$pattern/ix')){
-                       $matcher = 'm/$pattern/ix';
-               }else {
-                       $c->reply("bad regexp");
-                       return;
-               }
-       }else{
-               $matcher = '(index uc($_), uc($pattern)) != -1';
-       }
-       my $file = new File::Temp( SUFFIX => '.txt' );
-       my $n = 1;
-       my $match = 0;
-       for (@FILE){
-               chomp;
-               if (eval $matcher){
-                       $match = 1;
-                       print $file "$n: $_\n";
-               }
-               $n++;
+               my $dbh = $c->model;
+               my ($qid) = $dbh->selectrow_array(q{
+INSERT INTO quotes (uid,quote) VALUES($1,$2) RETURNING qid
+                       },  undef, $c->uid, $quote);
+               $c->reply("Quote <b>$qid</b> '$quote' added");
        }
-       if ($match){
-               close $file;
-               $c->message("dcc send ".$c->nick, $file);
-       }else{
-               $c->reply("No quotes matching <b>$pattern.</b>");
-       }
-}
-
-sub delquote
-       : Help(syntax: .delquote number)
-       : ACL(irc_delquote)
-{
-       my ($self,$c,$msg) = @_;
-       my ($n) = $msg =~ /(\d+)/ or die 'ARGS';
-       $n = $n-1;
-       if (exists $FILE[$n]){
-               my ($uid,$username) = $c->model->selectrow_array(q{
-SELECT uid,username FROM users where hostmask ILIKE ?
-                       },undef,$c->host);
+};
 
-               my $text = $FILE[$n];
-               push @OLDFILE,"Removed by $username ($uid): $text";
-               splice @FILE,$n,1;
-               $n++;
-               my $num = $#FILE+1;
-               $c->reply("Quote <b>$n</b> {$text} removed, number of quotes now: <b>$num</b>");
-       }else{
-               $c->reply("No such quote.");
+command delquote => {
+       help => q(syntax: .delquote number),
+       acl => q(irc_delquote),
+}, class extends NDIRC::Command {
+       method execute($c,$msg) {
+               my ($n) = $msg =~ /(\d+)/ or die 'ARGS';
+               my $dbh = $c->model;
+               my $quote = $dbh->selectrow_hashref(q{
+WITH q AS (DELETE FROM quotes WHERE qid = $1 RETURNING qid,time,uid,quote)
+INSERT INTO removed_quotes (qid,time,uid,quote,removed_by)
+       SELECT *, $2 AS removed_by FROM q RETURNING quote;
+                       },  undef, $n, $c->uid);
+               if ($quote){
+                       $c->reply("Quote <b>$n</b> {$quote->{quote}} removed");
+               }else{
+                       $c->reply("No such quote.");
+               }
        }
-}
+};
 
 1;