X-Git-Url: http://git.annexia.org/?p=xavierbot.git;a=blobdiff_plain;f=xavierbot.pl;h=7601136c1be0db899a05c3778c33e351cb9f15b6;hp=6b058e00d45bb38ab7841b3d6bc9930b6c8dc285;hb=1e6d6c08bec29a317316f107b7d9bde285c1f798;hpb=317ecc32edbd2757c6d9bf0311bd1391ec44cfc8 diff --git a/xavierbot.pl b/xavierbot.pl index 6b058e0..7601136 100755 --- a/xavierbot.pl +++ b/xavierbot.pl @@ -2,76 +2,93 @@ # xavierbot : an OCaml interpreter IRC bot. # By Richard W.M. Jones . # This code is in the Public Domain. -# $Id: xavierbot.pl,v 1.2 2007/06/28 16:22:33 rjones Exp $ +# $Id: xavierbot.pl,v 1.4 2007/06/28 20:49:10 rjones Exp $ use strict; -use POE qw(Component::IRC); +use POE qw(Component::IRC Wheel::Run); + +$ENV{PATH} = "/usr/bin:/bin"; #---------------------------------------------------------------------- # Start of configuration. my $nick = "xavierbot"; my $ircname = "Xavierbot"; # Printable name. -my $server = "devserv.devel.redhat.com"; +my $server = "chat.freenode.net"; +#my $server = "devserv.devel.redhat.com"; my $port = 6667; - -my @channels = ("#ocaml"); +my $channel = "#ocaml"; # End of configuration. #---------------------------------------------------------------------- -my $irc = POE::Component::IRC->spawn ( - nick => $nick, - ircname => $ircname, - server => $server, - port => $port, - ) or die "POE::Component::IRC->spawn failed: $!"; - POE::Session->create ( package_states => [ - main => [ qw(_default _start irc_001 irc_public) ], + main => [ qw(_default _start irc_001 irc_public got_stdout) ], ], - heap => { irc => $irc }, ); -$poe_kernel->run (); +POE::Kernel->run (); exit 0; -sub _start { +sub _start +{ my ($kernel, $heap) = @_[KERNEL,HEAP]; + my $irc = POE::Component::IRC->spawn + ( + nick => $nick, + ircname => $ircname, + server => $server, + port => $port, + ) or die "POE::Component::IRC->spawn failed: $!"; + + my $ocaml = POE::Wheel::Run->new + ( + Program => "./ocamlbotwrapper", + StdoutEvent => "got_stdout", + StderrEvent => "got_stdout", + ) or die "POE::Wheel::Run->new ./ocamlbotwrapper failed: $!"; + + $heap->{irc} = $irc; + $heap->{ocaml} = $ocaml; + my $irc_session = $heap->{irc}->session_id (); $kernel->post ($irc_session => register => "all"); $kernel->post ($irc_session => connect => { }); + undef; } -sub irc_001 { +sub irc_001 +{ my ($kernel, $sender) = @_[KERNEL,SENDER]; my $poco_object = $sender->get_heap (); print "Connected to ", $poco_object->server_name (), "\n"; - $kernel->post ($sender => join => $_ ) for @channels; + $kernel->post ($sender => join => $channel); undef; } -sub irc_public { - my ($kernel, $sender, $who, $where, $what) = - @_[KERNEL,SENDER,ARG0,ARG1,ARG2]; +sub irc_public +{ + my ($kernel, $sender, $who, $where, $what, $heap) = + @_[KERNEL,SENDER,ARG0,ARG1,ARG2,HEAP]; my $nick = (split /!/, $who)[0]; my $channel = $where->[0]; print "got: $what\n"; - if (my ($rot13) = $what =~ /^rot13 (.+)/) { - $rot13 =~ tr[a-zA-Z][n-za-mN-ZA-M]; - $kernel->post ($sender => privmsg => $channel => "$nick: $rot13"); + if (my ($stmt) = $what =~ /^\s*([^#].*;;)\s*$/) { + print "stmt = $stmt\n"; + $heap->{ocaml}->put ("$stmt\n"); } undef; } -sub _default { +sub _default +{ my ($event, $args) = @_[ARG0 .. $#_]; my @output = ("$event: "); @@ -85,3 +102,14 @@ sub _default { print STDOUT join " ", @output, "\n"; return 0; } + +#---------------------------------------------------------------------- + +# Bot wrote something. + +sub got_stdout +{ + my ($kernel,$heap, $input, $wheel_id) = @_[KERNEL,HEAP,ARG0,ARG1]; + print "Child said: $input\n"; + $kernel->post ($heap->{irc} => privmsg => $channel => "$input"); +}