How can I make my Perl Jabber bot an event-driven program?
- by TheGNUGuy
I'm trying to make a Jabber bot and I am having trouble keeping it running while waiting for messages. How do I get my script to continuously run? I have tried calling a subroutine that has a while loop that I, in theory, have set up to check for any messages and react accordingly but my script isn't behaving that way.
Here is my source: http://pastebin.com/03Habbvh
# set jabber bot callbacks
$jabberBot-SetMessageCallBacks(chat=\&chat);
$jabberBot-SetPresenceCallBacks(available=\&welcome,unavailable=\&killBot);
$jabberBot-SetCallBacks(receive=\&prnt,iq=\&gotIQ);
$jabberBot-PresenceSend(type="available");
$jabberBot-Process(1);
sub welcome
{
print "Welcome!\n";
$jabberBot-MessageSend(to=$jbrBoss-GetJID(),subject="",body="Hello There!",type="chat",priority=10);
&keepItGoing;
}
sub prnt
{
print $_[1]."\n";
}
#$jabberBot-MessageSend(to=$jbrBoss-GetJID(),subject="",body="Hello There! Global...",type="chat",priority=10);
#$jabberBot-Process(5);
#&keepItGoing;
sub chat
{
my ($sessionID,$msg) = @_;
$dump-pl2xml($msg);
if($msg-GetType() ne 'get' && $msg-GetType() ne 'set' && $msg-GetType() ne '')
{
my $jbrCmd = &trimSpaces($msg-GetBody());
my $dbQry = $dbh-prepare("SELECT command,acknowledgement FROM commands WHERE message = '".lc($jbrCmd)."'");
$dbQry-execute();
if($dbQry-rows() 0 && $jbrCmd !~ /^insert/si)
{
my $ref = $dbQry-fetchrow_hashref();
$dbQry-finish();
$jabberBot-MessageSend(to=$msg-GetFrom(),subject="",body=$ref-{'acknowledgement'},type="chat",priority=10);
eval $ref-{'command'};
&keepItGoing;
}
else
{
$jabberBot-MessageSend(to=$msg-GetFrom(),subject="",body="I didn't understand you!",type="chat",priority=10);
$dbQry-finish();
&keepItGoing;
}
}
}
sub gotIQ
{
print "iq\n";
}
sub trimSpaces
{
my $string = $_[0];
$string =~ s/^\s+//; #remove leading spaces
$string =~ s/\s+$//; #remove trailing spaces
return $string;
}
sub keepItGoing
{
print "keepItGoing!\n";
my $proc = $jabberBot-Process(1);
while(defined($proc) && $proc != 1)
{
$proc = $jabberBot-Process(1);
}
}
sub killBot
{
print "killing\n";
$jabberBot-MessageSend(to=$_[0]-GetFrom(),subject="",body="Logging Out!",type="chat",priority=10);
$jabberBot-Process(1);
$jabberBot-Disconnect();
exit;
}