X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=Commands%2FQuotes.pm;h=7c0f669f20ace34fbb9f24db1dd1295971419d78;hb=cf8fc5e52f53abda2b2372fb8c337710155f9525;hp=608832f9d38094c40173c8d92c0800105acf7d10;hpb=a7e034b3599d41cdf5a158b14bd1715451f89a0c;p=NDIRC.git diff --git a/Commands/Quotes.pm b/Commands/Quotes.pm index 608832f..7c0f669 100644 --- a/Commands/Quotes.pm +++ b/Commands/Quotes.pm @@ -17,109 +17,82 @@ # 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+)/; - - $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 $n of $num: $text"); -} - -sub addquote - : Help(syntax .addquote quote) -{ - my ($self,$c,$quote) = @_; - - die 'ARGS' unless $quote; +use MooseX::Declare; +use NDIRC::Dispatcher; + + +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 $quote->{qid}: $quote->{quote}"); + } else { + $c->reply("No quote with id $1"); + } + } 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 $quote->{qid}: $quote->{quote}"); + } else { + $c->reply("No quote matching $1"); + } + } 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 $quote->{qid}: $quote->{quote}"); + } + } +}; - push @FILE, $quote; - my $num = $#FILE+1; - $c->reply("Quote $num added"); -} +command addquote => { + help => q(syntax .addquote quote), +}, class extends NDIRC::Command { + method execute($c,$msg) { -sub findquote - : Help(syntax .findquote pattern | findqre lets you use a regex pattern) - : Alias(findqre) -{ - my ($self,$c,$pattern) = @_; - die 'ARGS' unless $pattern; + my ($quote) = $msg =~ /^\s*(.+?)\s*$/ or die 'ARGS'; - 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 $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 $qid '$quote' added"); } - 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"; +}; + +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 $n {$quote->{quote}} removed"); + }else{ + $c->reply("No such quote."); } - $n++; - } - if ($match){ - $file->flush; - $c->command(dcc => $c->nick => SEND => $file); - }else{ - $c->reply("No quotes matching $pattern."); - } -} - -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 uid = ? - },undef,$c->uid); - - my $text = $FILE[$n]; - push @OLDFILE,"Removed by $username ($uid): $text"; - splice @FILE,$n,1; - $n++; - my $num = $#FILE+1; - $c->reply("Quote $n {$text} removed, number of quotes now: $num"); - }else{ - $c->reply("No such quote."); } -} +}; 1;