diff options
Diffstat (limited to 'scripts/eliza.pl')
-rw-r--r-- | scripts/eliza.pl | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/scripts/eliza.pl b/scripts/eliza.pl new file mode 100644 index 0000000..b8d5674 --- /dev/null +++ b/scripts/eliza.pl @@ -0,0 +1,107 @@ +# Answers to /msg's using Chatbot::Eliza when you're away. + +# Put definition files to ~/.irssi/eliza/*.txt +# Uses the default definitions if there aren't any definition files. +# http://misterhouse.net:81/mh/data/eliza/ + +use strict; +use 5.6.0; +use Irssi; +use Chatbot::Eliza; + +use vars qw($VERSION %IRSSI $eliza_dir @cmd_queue + $min_reply_time $max_reply_time + %conversations $conversation_expire); + +$VERSION = '1.0'; +%IRSSI = ( + authors => 'Johan "Ion" Kiviniemi', + contact => 'ion at hassers.org', + name => 'Eliza', + description => 'Answers to /msg\'s using Chatbot::Eliza when you\'re away.', + license => 'Public Domain', + url => 'http://ion.amigafin.org/scripts/', + changed => 'Thu Mar 14 05:29 EET 2002', +); + +$eliza_dir = Irssi::get_irssi_dir . "/eliza"; +undef $eliza_dir unless -d $eliza_dir; + +$min_reply_time = 5; # seconds +$max_reply_time = 15; # seconds as well +$conversation_expire = 600; # seconds again + +Irssi::timeout_add( + 1000 * $conversation_expire, sub { + foreach (keys %conversations) { + if ($conversations{$_}{lastmsg} < time - $conversation_expire) { + # The Chatbot::Eliza object will be destroyed automagically. + delete $conversations{$_}; + } + } + }, + undef +); + +sub new_eliza { + my ($name, $eliza_o, @files) = shift; + if ($eliza_dir) { @files = <$eliza_dir/*.txt> } + if (@files) { + $eliza_o = Chatbot::Eliza->new(scriptfile => $files[ rand @files ]) + || return; + } else { + $eliza_o = Chatbot::Eliza->new() || return; + } + $eliza_o->name($name); + return $eliza_o; +} + +Irssi::signal_add( + 'message private' => sub { + # Someone just msg'ed me. + my ($server, $message, $nick, $address) = @_; + return if $nick eq $server->{nick}; + + # Ignore it if I'm not away. + return unless $server->{usermode_away}; + + if (not $conversations{$address} + and $conversations{$address}{lastmsg} < time - $conversation_expire) + { + # A new conversation. + $conversations{$address} = { lastmsg => time }; + unless ($conversations{$address}{eliza} = + new_eliza($server->{nick})) + { + Irssi::print("Chatbot::Eliza->new() failed!", + MSGLEVEL_CLIENTERROR); + delete $conversations{$address}; + return; + } + } else { + # Continuing an old conversation. + $conversations{$address}{lastmsg} = time; + } + push_queue($server, "msg $nick " + . $conversations{$address}{eliza}->transform($message)); + } +); + +sub push_queue { + my ($server, $command) = @_; + return if @cmd_queue > 3; + my $reply_time = + int(time + $min_reply_time + rand($max_reply_time - $min_reply_time)); + push @cmd_queue, [ $reply_time, $server, $command ]; + @cmd_queue = sort { $a->[0] <=> $b->[0] } @cmd_queue; +} + +Irssi::timeout_add( + 1000, sub { + while (@cmd_queue and $cmd_queue[0][0] <= time) { + my $cmd = shift @cmd_queue; + $cmd->[1]->command($cmd->[2]); + } + }, + undef +); |