diff options
| author | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
|---|---|---|
| committer | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
| commit | 2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1 (patch) | |
| tree | 1c5e6d817c88e67b46e216a50e0aef5428bf63df /scripts/eliza.pl | |
| parent | 2d080422d79d1fd49d6c5528593ccaaff9bfc583 (diff) | |
| download | scripts.irssi.org-2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1.tar.bz2 | |
Import scripts from scripts.irssi.org
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 +); | 
