<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Obsolete Your Idols &#187; chatbot</title>
	<atom:link href="http://blog.manjusri.org/tag/chatbot/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.manjusri.org</link>
	<description>Book Reviews and Blather</description>
	<lastBuildDate>Mon, 21 Jun 2010 05:51:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Couldn&#8217;t Stop Searching</title>
		<link>http://blog.manjusri.org/2009/04/19/couldnt-stop-searching/</link>
		<comments>http://blog.manjusri.org/2009/04/19/couldnt-stop-searching/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 06:07:27 +0000</pubDate>
		<dc:creator>binder</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[muck]]></category>
		<category><![CDATA[mud]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://blog.manjusri.org/?p=174</guid>
		<description><![CDATA[I was fiddling around for something to do with a Yahoo API and so now the MUD chatbot returns (simple) websearch results. Isn&#8217;t that nice? I think it&#8217;s nice. #!/usr/bin/perl # mudbot by Shannon Prickett # connect a pandorabots.com chatbot with a particular TinyMUCK, Pegasus. package mudbot; use Smart::Comments; use Modern::Perl; use Net::Telnet; use Net::AIML; [...]]]></description>
			<content:encoded><![CDATA[<p>I was fiddling around for something to do with a Yahoo API and so now the MUD chatbot returns (simple) websearch results.  Isn&#8217;t that nice?  I think it&#8217;s nice.</p>
<pre>
#!/usr/bin/perl

# mudbot by Shannon Prickett <stp@manjusri.org>
# connect a pandorabots.com chatbot with a particular TinyMUCK, Pegasus.

package mudbot;

use Smart::Comments;
use Modern::Perl;
use Net::Telnet;
use Net::AIML;
use DB_File;
use WWW::Mechanize;

use vars qw{$being_quiet %global_exit $mud_connection $mud_conversation $mud_host $mud_name
            $mud_pass $mud_port $mud_sent $pid $robot %room_name $yahoo_id};
use subs qw{setup sometimes speak};

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

tie %room_name, 'DB_File', 'mapfile' or
    die "can't tie to mapfile: $!\n";

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

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

$yahoo_id = 'LALALALA';
setup( $mud_connection );

TALKLOOP: while (1) {
    ### TALKLOOP start

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

    my ($stub_said, $what_said) =
        $mud_connection->waitfor(   Match => '/ says, ".*"/',
                                    Errmode => 'return', );

    next TALKLOOP unless defined $what_said;

    $stub_said =~ qr{ START \d+ .+ \b(\w+)\b }msx;
    $who_said = $1;

    $what_said =~ s{says, \"(.*)\"}{$1}g;

    ### Got: $who_said
    ### Got: $what_said

    if ($what_said =~ qr{$mud_name}msxi){
        ### saw my name
        $atme = 1;
    }

    $what_said =~ s{$mud_name}{}g;

    if ( ($atme) &#038;&#038; ($what_said =~ qr{QUIT}) ) {
        $mud_connection->print("QUIT");
        exit;
    }

    if ( ($atme) &#038;&#038; ($what_said =~ qr{be quiet}) ) {
        if ($being_quiet) {
            $mud_connection->print("say Maximum verbosity achieved.");
            $being_quiet = 0;
        } else
        {
            $mud_connection->print("say Shutting up now.");
            $being_quiet = 1;
        }
    }

    if ( ($atme) &#038;&#038; ($what_said =~ qr{search for ([\w\s]+)}) ) {
        ### requested to search
        my $terms = $1;
        ### got: $terms

        my @terms = split ' ', $terms;
        my $querystring = join '+', @terms;

        if (sometimes( )) {
            $mud_connection->print("say Found http://lmgtfy.com/?q=$querystring");
        } else
        {
            my $web_connect = WWW::Mechanize->new( autocheck => 1);
            $web_connect->get( "http://boss.yahooapis.com/ysearch/web/v1/$querystring?appid=$yahoo_id&#038;format=xml");

            my $results = $web_connect->content();
            if (defined $results) {
                speak( 'Found some URLs:' );
            }
            my @lines = split /\n/, $results;
            for my $line ( @lines ) {
            ### got: $line
                if ($line =~ qr{<url>(.+)</url>}) {
                    my $output = $1;
                    speak( $output );
                }
            }
        }

        next TALKLOOP;
    }

    if ( ($atme) &#038;&#038; ($what_said =~ qr{explore}) ) {
        $mud_connection->print("say OK, going to poke around now.");
        sleep 3;
        $mud_connection->print('home');
        goto EXPLORELOOP;
    }

    if ($being_quiet) {
        next TALKLOOP;
    }

    my $response = $robot->tell($what_said);
    if ($atme) {
        print "response: $response\n";
        speak( $response );
    }
    else {
        if ( !$being_quiet &#038;&#038; (sometimes()) ) {
            print "jumping in with $response\n";
            speak( $response );
        }
    }
}

EXPLORELOOP: while (1) {
    ### exploring

    my ($name, $desc);

    $mud_connection->print('look');
    my $startmark   = $mud_connection->getline( );
    $name           = $mud_connection->getline( );
    while (my $line = $mud_connection->getline( Errmode => 'return', )) {
        $desc .= $line;
    }

    $mud_connection->waitfor( Match => '/END$pid/', Errmode => 'return');
    chomp $name;
    chomp $desc;

    ### got: $name
    ### got: $desc

    $room_name{$name} = $desc;

    sleep 10;

    $mud_connection->print('out');
}

sub setup {
    my $mc = shift;

    $mc->dump_log('/home/binder/src/mb/logfile');

    $mc->waitfor('/connect\s+guest\s+guest/');
    $mc->print("connect $mud_name $mud_pass");

    $mc->waitfor('/Vote to ban the MisInformation SuperHighway/');
    $mc->print('@desc me=Just a Perl toy of Binder\'s.');

    $mc->print("OUTPUTPREFIX START$pid");
    $mc->print("OUTPUTSUFFIX END$pid");

    $mc->waitfor('/Description set/');
    $mc->print("home\nout\nvillage");
}

sub sometimes {
    return (rand() > .75);
}

sub speak {
    my $response = shift;
    my @lines = split /\n/, $response;
    for my $line (@lines) {
        $mud_connection->print("say $line");
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.manjusri.org/2009/04/19/couldnt-stop-searching/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Bot Who Came In Out of the Cold</title>
		<link>http://blog.manjusri.org/2009/04/19/the-bot-who-came-in-out-of-the-cold/</link>
		<comments>http://blog.manjusri.org/2009/04/19/the-bot-who-came-in-out-of-the-cold/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 18:22:00 +0000</pubDate>
		<dc:creator>binder</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[muck]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.manjusri.org/?p=172</guid>
		<description><![CDATA[I&#8217;ve now sunk a number of hours into it and added some functionality, none of which really works yet. But in the interest of keeping things going, here&#8217;s where things stand now. Explore doesn&#8217;t quite work, and there are still weird undef matches in the dialogue. But I pulled out all of Expect.pm and went [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve now sunk a number of hours into it and added some functionality, none of which really works yet.  But in the interest of keeping things going, here&#8217;s where things stand now.  Explore doesn&#8217;t quite work, and there are still weird undef matches in the dialogue.  But I pulled out all of Expect.pm and went to Smart::Comments.</p>
<p><code><br />
#!/usr/bin/perl</p>
<p># mudbot by Shannon Prickett <stp@manjusri.org><br />
# connect a pandorabots.com chatbot with a particular TinyMUCK, Pegasus.</p>
<p>package mudbot;</p>
<p>use Smart::Comments;<br />
use Modern::Perl;<br />
use Net::Telnet;<br />
use Net::AIML;<br />
use DB_File;</p>
<p>use vars qw{$being_quiet %global_exit $mud_connection $mud_conversation $mud_host $mud_name<br />
            $mud_pass $mud_port $mud_sent $pid $robot %room_name };<br />
use subs qw{setup};</p>
<p>$mud_host       = 'ginka.armageddon.org';<br />
$mud_port       = '4242';<br />
$mud_name       = 'Somebot';<br />
$mud_pass       = 'YRMEME';<br />
$being_quiet    = 0;<br />
$pid            = $$;</p>
<p>tie %room_name, 'DB_File', 'mapfile' or<br />
    die "can't tie to mapfile: $!\n";</p>
<p>$robot          = Net::AIML->new( botid => 'GETFROMPANDORABOTS' ); </p>
<p>$mud_connection = new Net::Telnet( Host => $mud_host, Port => $mud_port )<br />
                    or die "Can't connect to $mud_host $mud_port: $!";</p>
<p>setup( $mud_connection );</p>
<p>TALKLOOP: while (1) {<br />
    ### TALKLOOP start</p>
<p>    my $atme = 0;<br />
    my $prematch = '';<br />
    my $postmatch = '';<br />
    my $who_said;</p>
<p>    my ($stub_said, $what_said) =<br />
        $mud_connection->waitfor(   Match => '/ says, ".*"/',<br />
                                    Errmode => 'return', );</p>
<p>    next TALKLOOP unless defined $what_said;</p>
<p>    $stub_said =~ qr{ START \d+ .+ \b(\w+)\b }msx;<br />
    $who_said = $1;</p>
<p>    $what_said =~ s{says, \"(.*)\"}{$1}g;</p>
<p>    ### Got: $who_said<br />
    ### Got: $what_said</p>
<p>    if ($what_said =~ qr{$mud_name}msxi){<br />
        ### saw my name<br />
        $atme = 1;<br />
    }</p>
<p>    $what_said =~ s{$mud_name}{}g;</p>
<p>    if ( ($atme) &#038;&#038; ($what_said =~ qr{QUIT}) ) {<br />
        $mud_connection->print("QUIT");<br />
        exit;<br />
    }</p>
<p>    if ( ($atme) &#038;&#038; ($what_said =~ qr{be quiet}) ) {<br />
        if ($being_quiet) {<br />
            $mud_connection->print("say Maximum verbosity achieved.");<br />
            $being_quiet = 0;<br />
        } else<br />
        {<br />
            $mud_connection->print("say Shutting up now.");<br />
            $being_quiet = 1;<br />
        }<br />
    }</p>
<p>    if ( ($atme) &#038;&#038; ($what_said =~ qr{search for '(.*)'}msxi) ) {<br />
        my $terms = $1;<br />
        my @terms = split $terms;<br />
        my $querystring = join '+', @terms;<br />
        $mud_connection->print("say Found http://lmgtfy.com/q=$querystring");<br />
    }</p>
<p>    if ( ($atme) &#038;&#038; ($what_said =~ qr{explore}) ) {<br />
        $mud_connection->print("say OK, going to poke around now.");<br />
        sleep 3;<br />
        $mud_connection->print('home');<br />
        goto EXPLORELOOP;<br />
    }</p>
<p>    if ($being_quiet) {<br />
        next TALKLOOP;<br />
    }</p>
<p>    my $response = $robot->tell($what_said);<br />
    if ($atme) {<br />
        print "response: $response\n";<br />
        speak( $response );<br />
    }<br />
    else {<br />
        if ( !$being_quiet &#038;&#038; (rand() > .75) ) {<br />
            print "jumping in with $response\n";<br />
            speak( $response );<br />
        }<br />
    }<br />
}</p>
<p>EXPLORELOOP: while (1) {<br />
    ### exploring</p>
<p>    my ($name, $desc);</p>
<p>    $mud_connection->print('look');<br />
    my $startmark   = $mud_connection->getline( );<br />
    $name           = $mud_connection->getline( );<br />
    while (my $line = $mud_connection->getline( Errmode => 'return', )) {<br />
        $desc .= $line;<br />
    }</p>
<p>    $mud_connection->waitfor( Match => '/END$pid/', Errmode => 'return');<br />
    chomp $name;<br />
    chomp $desc;</p>
<p>    ### got: $name<br />
    ### got: $desc</p>
<p>    $room_name{$name} = $desc;</p>
<p>    sleep 10;</p>
<p>    $mud_connection->print('out');<br />
}</p>
<p>sub setup {<br />
    my $mc = shift;</p>
<p>    $mc->dump_log('/home/binder/src/mb/logfile');</p>
<p>    $mc->waitfor('/connect\s+guest\s+guest/');<br />
    $mc->print("connect $mud_name $mud_pass");</p>
<p>    $mc->waitfor('/Vote to ban the MisInformation SuperHighway/');<br />
    $mc->print('@desc me=Just a Perl toy of Binder\'s.');</p>
<p>    $mc->print("OUTPUTPREFIX START$pid");<br />
    $mc->print("OUTPUTSUFFIX END$pid");</p>
<p>    $mc->waitfor('/Description set/');<br />
    $mc->print("home\nout\nvillage");<br />
}</p>
<p>sub speak {<br />
    my $response = shift;<br />
    my @lines = split /\n/, $response;<br />
    for my $line (@lines) {<br />
        $mud_connection->print("say $line");<br />
    }<br />
}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.manjusri.org/2009/04/19/the-bot-who-came-in-out-of-the-cold/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Another Sixty Minutes Down</title>
		<link>http://blog.manjusri.org/2009/04/17/another-sixty-minutes-down/</link>
		<comments>http://blog.manjusri.org/2009/04/17/another-sixty-minutes-down/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 16:40:03 +0000</pubDate>
		<dc:creator>binder</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[aiml]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.manjusri.org/?p=169</guid>
		<description><![CDATA[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'; [...]]]></description>
			<content:encoded><![CDATA[<p>And the bot is now both more and less annoying.  Updated code below.</p>
<pre>
<code>
#!/usr/bin/perl

# mudbot by Shannon Prickett <stp@manjusri.org>
# 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) &#038;&#038; ($postmatch =~ qr{QUIT}) ) {
        $mud_conversation->send("QUIT\n");
        exit;
    }

    if ( ($atme) &#038;&#038; ($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 &#038;&#038; (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();
}
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.manjusri.org/2009/04/17/another-sixty-minutes-down/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Sixty Minute MUDbot.</title>
		<link>http://blog.manjusri.org/2009/04/16/the-sixty-minute-mudbot/</link>
		<comments>http://blog.manjusri.org/2009/04/16/the-sixty-minute-mudbot/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 07:13:56 +0000</pubDate>
		<dc:creator>binder</dc:creator>
				<category><![CDATA[Nerdery]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.manjusri.org/?p=164</guid>
		<description><![CDATA[I decided to scratch an itch and practice a little bit of the Manifesto of the Cult of Done tonight.  So I wrote a clunky and fragile Perl wrapper which ties a chatbot to a MUCK.  Here&#8217;s the code. #!/usr/bin/perl # mudbot by Shannon Prickett # connect a pandorabots.com chatbot with a particular TinyMUCK, Pegasus. [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to scratch an itch and practice a little bit of the <a href="http://www.brepettis.com/blog/2009/3/3/the-cult-of-done-manifesto.html">Manifesto of the Cult of Done</a> tonight.  So I wrote a clunky and fragile Perl wrapper which ties a chatbot to a MUCK.  Here&#8217;s the code.</p>
<p><code></p>
<pre>
#!/usr/bin/perl

# mudbot by Shannon Prickett <stp@manjusri.org>
# 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");
                                });

while (1) {
    my $command;
    $mud_conversation->expect(3,
                             '-re',
                             qr{ Somebot }msx,
                             sub {  my $fh = shift;
                                    $command = $mud_conversation->after();
                                    $command =~ tr{\,\"\.\!}{}d;
                                    print "matched: $command\n";
                                    if ($command =~ qr{QUIT}) {
                                        $fh->send("QUIT\n");
                                        exit;
                                    } else
                                    {
                                        if (length($command)>3) {
                                            my $response = $robot->tell($command);
                                            $fh->send("say $response\n");
                                        }
                                    }
                                }
                            );
}
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.manjusri.org/2009/04/16/the-sixty-minute-mudbot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
