Posts Tagged ‘aiml’

Another Sixty Minutes Down

Friday, April 17th, 2009

And the bot is now both more and less annoying. Updated code below.


#!/usr/bin/perl

# mudbot by Shannon Prickett 
# connect a pandorabots.com chatbot with a particular TinyMUCK, Pegasus.

package mudbot;
use Modern::Perl;
use Net::Telnet;
use Net::AIML;
use Expect;

use vars qw{$mud_connection $mud_conversation $mud_host $mud_name $mud_pass $mud_port $mud_sent $robot};

$mud_host = 'ginka.armageddon.org';
$mud_port = '4242';
$mud_name = 'Somebot';
$mud_pass = 'YRMEME';

$robot = Net::AIML->new( botid => 'GETTHISNUMBERFROMPANDORABOTS' ); 

$mud_connection = new Net::Telnet( Host => $mud_host, Port => $mud_port )
    or die "Can't connect to $mud_host $mud_port: $!";

$mud_conversation = Expect->exp_init($mud_connection);

$mud_conversation->log_group(1);
$mud_conversation->log_user(1);
$mud_conversation->log_stdout(1);
$mud_conversation->log_file("/home/binder/src/mb/logfile", 'w');

$mud_conversation->expect(30,   '-re', qr{connect       # pretty standard MUCK greeting
                                    \s+
                                    guest
                                    \s+
                                    guest}msx,
                                sub {
                                    my $fh = shift;
                                    $fh->send("connect $mud_name $mud_pass\n");
                                    });

$mud_conversation->expect(30, 'Vote to ban the MisInformation SuperHighway',
                            sub {
                                my $fh = shift;
                                $fh->send("\@desc me=Just a Perl toy of Binder's.\n");
                                });

$mud_conversation->expect(30, 'Description set',
                            sub {
                                my $fh = shift;
                                $fh->send("home\nout\nvillage\n");
                                });

TALKLOOP: while (1) {
    print "TALKLOOP start\n";

    my $being_quiet = 0;
    my $atme = 0;
    my $prematch = '';
    my $postmatch = '';

    my $index = $mud_conversation->expect( 60, '-re', qr{ says, "} );  

    $prematch = $mud_conversation->before();
    $postmatch = $mud_conversation->after();
    $mud_conversation->clear_accum();

    next TALKLOOP unless $prematch;

    $postmatch =~ s{\"}{};
    print "$prematch said $postmatch\n";

    if ($postmatch =~ qr{$mud_name}){
        print "saw my name\n";
        $postmatch =~ s{$mud_name}{Persephone}g;
        $atme = 1;
    }

    if ( ($atme) && ($postmatch =~ qr{QUIT}) ) {
        $mud_conversation->send("QUIT\n");
        exit;
    }

    if ( ($atme) && ($postmatch =~ qr{be quiet}) ) {
        if ($being_quiet) {
            $mud_conversation->send("say Maximum verbosity achieved.\n");
            $being_quiet = 0;
        } else
        {
            $mud_conversation->send("say Shutting up now.\n");
            $being_quiet = 1;
        }
    }

    if ($being_quiet) {
        next TALKLOOP;
    }

    if ($atme) {
        my $response = $robot->tell($postmatch);
        print "response: $response\n";
        $mud_conversation->send("say $response\n");
    }
    else {
        if ( !$being_quiet && (rand() > .75) ) {
            print "jumping in\n";
            my $response = $robot->tell($postmatch);
            print "response: $response\n";
            $mud_conversation->send("say $response\n");
        }
    }
}
continue {
    $mud_conversation->clear_accum();
}

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...