1
0
mirror of synced 2024-12-12 22:36:02 +03:00

irc bot example

This commit is contained in:
zYne 2007-11-10 21:25:15 +00:00
parent 060784adfb
commit 46f2277094

154
tools/Bot.php Normal file
View File

@ -0,0 +1,154 @@
<?php
// Read Unix Time and put into a variable for uptime logging
$starttime = time();
// Prevent PHP from stopping the script after 30 sec
set_time_limit(0);
require_once '../Doctrine/trunk/lib/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));
class DBot
{
protected $_options = array('server' => 'irc.freenode.net',
'port' => 6667,
'username' => 'Doctrine',
'hostname' => 'phpdoctrine.net',
'servername' => 'Doctrine',
'realname' => 'Doctrine bot',
'nick' => 'Doctrine',
'channels' => array('#doctrine-test'));
protected $_socket;
public function connect()
{
// Open the socket to the IRC server
$this->_socket = fsockopen($this->_options['server'], $this->_options['port']);
unlink('log.txt');
sleep(1);
Doctrine_Manager::connection('sqlite::memory:');
// Send auth info
$this->execute('USER ' . $this->_options['username'] . ' ' .
$this->_options['hostname'] . ' ' .
$this->_options['servername'] . ' :' .
$this->_options['realname'] . "\n");
$this->execute('NICK ' . $this->_options['nick'] . "\n");
foreach ($this->_options['channels'] as $channel) {
$this->execute('JOIN ' . $channel . "\n");
}
}
public function execute($command)
{
fputs($this->_socket, $command);
$this->log('>>> ' . $command);
}
public function log($command)
{
$fp = fopen('log.txt', 'a+');
fwrite($fp, $command);
fclose($fp);
}
public function disconnect()
{
$this->execute('QUIT' . "\n");
fclose($this->_socket);
}
// IRC Functions [BEGIN]
// Joins channel
public function join($channel)
{
$this->execute('JOIN ' . $channel . "\r\n");
}
// Leaves the channel
public function part($channel){
$this->execute('PART ' . $channel . "\r\n");
}
// send message to channel/user
public function say($to, $msg){
$this->execute('PRIVMSG '. $to . ' :' . $msg . "\r\n");
}
// modes: +o, -o, +v, -v, etc.
public function setMode($user, $mode){
$this->execute('MODE ' . $this->channel . ' ' . $mode . ' ' . $user . "\r\n");
}
// kicks user from the channel
public function kick($user, $from, $reason = "")
{
$this->execute('KICK ' . $from . ' ' . $user . ' :' . $reason . "\r\n");
}
// changes the channel topic
public function topic($channel, $topic)
{
$this->execute('TOPIC ' . $channel . ' :' . $topic . "\r\n");
}
public function run()
{
$this->connect();
// Force an endless while
while( ! feof($this->_socket)) {
// Continue the rest of the script here
$data = fgets($this->_socket, 4096);
print $data . "<br>";
// Separate all data
$ex = explode(' ', $data);
// Send PONG back to the server
if ($ex[0] == 'PING') {
$this->execute('PONG ' . $ex[1] . "\n");
}
//$this->log($data);
// Say something in the channel
$command = str_replace(array(chr(10), chr(13)), '', $ex[3]);
// strip out ':'
$command = substr($command, 1);
array_shift($ex);
array_shift($ex);
$scope = array_shift($ex);
array_shift($ex);
$argsStr = implode(' ', $ex);
//$this->log($command . ' ' . $scope);
switch ($command) {
case '!shutdown':
$this->disconnect();
exit;
break;
case '!native-expr':
$portableExpr = $ex[0];
break;
}
}
}
}
$bot = new Dbot();
$bot->run();