# 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->command(dcc => $c->nick => SEND => $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;