diff options
| author | David Phillips <david@sighup.nz> | 2019-10-24 21:47:41 +1300 | 
|---|---|---|
| committer | David Phillips <david@sighup.nz> | 2019-10-24 22:05:51 +1300 | 
| commit | a5ed1088cd4e28b2bc9977801b4c087cc645b585 (patch) | |
| tree | ffa061bd3cd3d74d746e8ad5b31dab0a6ed622c2 /Plugin | |
| parent | e5575b32bd66784ccd88220d48253b9bc6206356 (diff) | |
| download | idalius-a5ed1088cd4e28b2bc9977801b4c087cc645b585.tar.xz | |
Quote_Grab: First cut prototype of the module
Diffstat (limited to 'Plugin')
| -rw-r--r-- | Plugin/Quote_Grab.pm | 124 | 
1 files changed, 124 insertions, 0 deletions
| diff --git a/Plugin/Quote_Grab.pm b/Plugin/Quote_Grab.pm new file mode 100644 index 0000000..5b81ce9 --- /dev/null +++ b/Plugin/Quote_Grab.pm @@ -0,0 +1,124 @@ +package Plugin::Quote_Grab; + +use strict; +use warnings; + +use DBI qw/:sql_types/; + +my $config; +my $db; + +# Last message said on a channel, by a person e.g $last["#chan"]["person"] +my %last; + +my $insert_quote; +my $random_quote; +my $random_quote_person; + +sub configure { +	my $self = shift; +	my $cmdref = shift; +	shift; # run_command +	$config = shift; + +	IdaliusConfig::assert_scalar($config, $self, "database"); + +	$cmdref->($self, "grab", sub { $self->grab(@_); } ); +	$cmdref->($self, "rq", sub { $self->random_quote(@_); } ); + +	$db = DBI->connect("dbi:SQLite:dbname=$config->{database}", undef, undef); + +	my $create_table = $db->prepare( +		"CREATE TABLE IF NOT EXISTS quotes(time, grabber, grabee, channel, text);" +	); +	$create_table->execute(); + +	# Prepare prepared statements +	$insert_quote = $db->prepare( +		"INSERT INTO quotes(time, grabber, grabee, channel, text) VALUES(strftime('%s', 'now'), ?, ?, ?, ?);" +	); +	$random_quote = $db->prepare( +		"SELECT text FROM quotes ORDER BY RANDOM() LIMIT ?" +	); +	$random_quote_person = $db->prepare( +		"SELECT text FROM quotes WHERE (grabee = ?) ORDER BY RANDOM() LIMIT ?" +	); + +	return $self; +} + +sub grab { +	my ($self, $irc, $logger, $who, $where, $ided, $rest, $no_reenter, @arguments) = @_; + +	if (ref($where) eq "ARRAY") { +		$where = $where->[0]; +	} + +	return "This command must be issued in a channel" unless $where =~ m/^#/; + +	my $grabee = shift @arguments; +	return "No message to grab" unless exists($last{$where}{$grabee}); + +	my $grabber = (split /!/, $who)[0]; +	my $grab_text = $last{$where}{$grabee}; + +	$insert_quote->bind_param(1, $grabber, SQL_VARCHAR); +	$insert_quote->bind_param(2, $grabee, SQL_VARCHAR); +	$insert_quote->bind_param(3, $where, SQL_VARCHAR); +	$insert_quote->bind_param(4, $grab_text, SQL_VARCHAR); +	$insert_quote->execute(); + +	return "yeetπππ―"; +} + +sub random_quote { +	my ($self, $irc, $logger, $who, $where, $ided, $rest, $no_reenter, @arguments) = @_; + +	my $q; +	my $grabee = shift @arguments; + +	if ($grabee) { +		$q = $random_quote_person; +		$q->bind_param(1, $grabee, SQL_VARCHAR); +		$q->bind_param(2, 1, SQL_INTEGER); # LIMIT 1 +	} else { +		$q = $random_quote; +		$q->bind_param(1, 1, SQL_INTEGER); # LIMIT 1 +	} +	$q->execute(); +	my ($quote) = $q->fetchrow(); + +	return "No quotes match" unless $quote; +	return $quote; +} + +sub on_message { +	my ($self, $logger, $who, $where, $raw_what, $what, $irc) = @_; + +	if (ref($where) eq "ARRAY") { +		$where = $where->[0]; +	} + +	return unless $where =~ m/^#/; + +	$who = (split /!/, $who)[0]; +	$last{$where}{$who} = "<$who> $what"; + +	return; +} + +sub on_action { +	my ($self, $logger, $who, $where, $raw_what, $what, $irc) = @_; + +	if (ref($where) eq "ARRAY") { +		$where = $where->[0]; +	} + +	return unless $where =~ m/^#/; + +	$who = (split /!/, $who)[0]; +	$last{$where}{$who} = "* $who $what"; + +	return; +} +1 | 
