summaryrefslogtreecommitdiffstats
path: root/scripts/eliza.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/eliza.pl')
-rw-r--r--scripts/eliza.pl107
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
+);