<?php
/*
* This bot is basically a very boring simple chatroom
* bot that sits in a chatroom and responds to three
* commands which are:
*
* !story
* !random
* !time
*
* To get it working:
* (1) Configure username and password
* (2) Start up script
* (3) Talk to bot(s) and say join <chatroom> - example: join bluetoctest
* (4) Try bot in chatroom
*/
require_once "bluetoc/EventHandlers/ObjectBased.php";
require_once "bluetoc/TocProtocol.php";
require_once "bluetoc/AimClient.php";
class ChatterBot extends AimClient
{
var $user;
// We have to keep a track of the chatrooms we are
// in since AIM requires us to identify chatrooms
// that we've joined as ID numbers that AIM
// gives you
var $chatrooms = array();
function ChatterBot($user, $pass)
{
$this->debug_mode = FALSE;
$this->aim_user = $user;
$this->aim_pass = $pass;
$this->user = $user;
$this->connect();
}
// Handle once we've signed on
function event_sign_on($args)
{
echo "{$this->user}: Yay! I've signed in!\n";
$this->set_info("<font face=Georgia>I am a chat bot! YAY!<br><br>I am powered by BlueTOC (AIM connection class for PHP)</font>");
}
// Handle when we join a chat
function event_chat_joined($args)
{
echo "{$this->user}: I have joined chat <b>{$args['name']}</b>\n";
// Add chatrooms to list of rooms we are in
$this->chatrooms[$args['chat_id']] = $args['name'];
}
// Handle when we get a chat message
function event_chat_message($args)
{
// Remember that AIM chat messages usually have HTML
// so we must strip it so that we can
// easily parse it
$message = strip_tags($args['message']);
// Just echo all the chat messages that we
// receive while in the chatroom
echo "{$this->user}: [{$this->chatrooms[$args['chat_id']]}] <{$args['user']}> {$message}\n";
// See if we can match !command
if(preg_match('`^!([A-Za-z0-9]+)`', $message, $msg))
{
switch($msg[1])
{
case 'story':
$this->chat_send($args['chat_id'], "<font face=Georgia>There was once a dog. It ate people.</font>");
break;
case 'random':
$this->chat_send($args['chat_id'], "<font face=Georgia>" . rand(0, 1000000) . "</font>");
break;
case 'time':
$this->chat_send($args['chat_id'], "<font face=Georgia>" . date('r') . "</font>");
break;
}
}
// Commands available:
// !story
// !random
// !time
}
// Handle when we get an instant message
function event_im($args)
{
echo "{$this->user}: {$args['user']} IMed me!\n";
// Remember that AIM IMs usually have HTML
// so we must strip it so that we can
// easily parse it
$message = strip_tags($args['message']);
// Let's check if they're telling us to
// join a certain chatroom
// The following responds to anyone! If you were to
// restrict to only some screen names, you would do
// a check on $args['user']
if(preg_match("`^join ([A-Za-z ]+)$`", $message, $m))
{
// We can only be in three chatrooms at once
if(count($this->chatrooms) >= 3)
{
$this->send_im($args['user'], "<font face=Georgia>I am already in three chatrooms</font>", FALSE);
}
else
{
$this->chat_join($m[1]);
$this->send_im($args['user'], "<font face=Georgia>Trying to join <b>{$m[1]}</b></font>", FALSE);
}
}
}
function event_error($args)
{
// These are a list of errors in English
// Most, if not all, errors will return an error number
// and not the error description
$connection_errors = array(
100 => 'Data unable to be sent',
200 => 'Flapon',
201 => 'Data not received from server after FLAPON packet',
202 => 'Invalid FLAP SIGNON response from the server',
203 => 'Invalid response from the server');
$aim_errors = array (
0 => 'Success',
1 => 'AOLIM Error: Unknown Error',
2 => 'AOLIM Error: Incorrect Arguments',
3 => 'AOLIM Error: Exceeded Max Packet Length (1024)',
4 => 'AOLIM Error: Reading from server',
5 => 'AOLIM Error: Sending to server',
6 => 'AOLIM Error: Login timeout',
901 => 'General Error: %s not currently available',
902 => 'General Error: Warning of %s not currently available',
903 => 'General Error: A message has been dropped, you are exceeding the server speed limit',
950 => 'Chat Error: Chat in %s is unavailable',
960 => 'IM and Info Error: You are sending messages too fast to %s',
961 => 'IM and Info Error: You missed an IM from %s because it was too big',
962 => 'IM and Info Error: You missed an IM from %s because it was sent too fast',
970 => 'Dir Error: Failure',
971 => 'Dir Error: Too many matches',
972 => 'Dir Error: Need more qualifiers',
973 => 'Dir Error: Dir service temporarily unavailble',
974 => 'Dir Error: Email lookup restricted',
975 => 'Dir Error: Keyword ignored',
976 => 'Dir Error: No keywords',
977 => 'Dir Error: Language not supported',
978 => 'Dir Error: Country not supported',
979 => 'Dir Error: Failure unknown %s',
980 => 'Auth Error: Incorrect nickname or password',
981 => 'Auth Error: The service is temporarily unavailable',
982 => 'Auth Error: Your warning level is too high to sign on',
983 => 'Auth Error: You have been connecting and disconnecting too frequently. Wait 10 minutes and try again. If you continue to try, you will need to wait even longer.',
989 => 'Auth Error: An unknown signon error has occurred %s');
// Let's see what kind of error we are faced with
switch($args['type'])
{
// Connection error
case ERROR_CONNECTION:
echo "* Connection error: {$connection_errors[$args['number']]} ({$args['number']})\n";
break;
// AIM is giving us an error
case ERROR_AIM:
echo "* AIM error: {$aim_errors[$args['number']]} ({$args['number']})\n";
break;
}
}
}
// Create a new instance of the bot
$client = new ChatterBot('username1', 'password1');
// Listen to the bot infinitely
while(true)
{
$client->listen();
usleep(150);
}
?>
|