<?php
/**
* BnetBot is a simple telnet based bot
*
* @author Nickolas Kost <[email protected]>
* @license http://www.apache.org/licenses/LICENSE-2.0
* @version 0.0.1
*/
class BnetBot {
public $sock;
public $errstr;
public $errno;
public $login;
public $pass;
public $channel;
public $host;
public $port;
public $bufferStack;
public $writeStack;
public $bufferSize=256;
public $_active;
const NL="\\r\\n";
function __construct($server,$port,$username,$pass,$channel) {
$this->host=strval(gethostbyname(trim($server)));
$this->port=intval($port);
$this->login=trim($username);
$this->pass=$pass;
$this->channel=$channel;
}
function __destruct()
{
$this->send("/exit");
$this->close();
}
function connect()
{
$this->open();
$this->init();
}
function init()
{
}
/**
* Init Socket
*/
function open()
{
$this->sock=@fsockopen($this->host, $this->port, $this->errno, $this->errstr,2);
if(!$this->sock)
{
die("\r\n[BOT][ERROR] Socket Error: $this->errstr");
}
$this->_active=true;
sleep(1);
$this->send(self::NL);
sleep(1);
socket_set_timeout($this->sock,10,0);
print "\r\n[BOT] INIT CONNECTION";
$this->initConnection();
}
/*
* Close Socket
*/
function close()
{
fclose($this->sock);
$this->_active=false;
}
/**
* Send auth info into Server
*/
function initConnection(){
$login_flag=$pass_flag=$chan_flag=false;
while($line=$this->read())
{
if(strstr($line,"Username:")&&!$login_flag)
{
//sleep(1);
$login_flag=true;
$this->send($this->login);
$this->send(self::NL);
continue;
}
elseif(strstr($line,"Password:")&&!$pass_flag)
{
//sleep(1);
$pass_flag=true;
$this->send($this->pass);
$this->send(self::NL);
$this->send(self::NL);
continue;
}
elseif(strstr($line,"Login failed."))
{
$this->_active=false;
$this->onDisconnect();
}
elseif(strstr($line,'['.$this->login.' is here]')&&!$chan_flag)
{
$chan_flag=true;
$this->send("/channel $this->channel");
$this->send(self::NL);
//sleep(1);
break;
}
}
return $login_flag&&$pass_flag&&$chan_flag;
}
/**
* Read from socket
* @return string Buffer
*/
function read()
{
$buffer=fread($this->sock,$this->bufferSize);
if(!$buffer)
{
$this->_active=false;
$this->onDisconnect();
}
$this->onRecieve(strval($buffer));
return $buffer;
}
/**
* Send Data to server(socket)
* @param string $data
*/
function send($data='')
{
$this->writeStack.= $data;
$buffer_len = strlen($this->writeStack);
$byte_written = fwrite($this->sock, $this->writeStack,256);
if ($byte_written === false)
{
//print "\r\n[BOT][SEND]ERROR";
$this->_active = false;
$this->onDisconnect();
}elseif($byte_written < $buffer_len)
{
//print "\r\n[BOT][SEND] $data";
$this->writeStack = substr($this->writeStack, $byte_written);
$this->write_len = $buffer_len - $byte_written;
}
else
{
$this->writeStack = '';
$this->write_len = 0;
}
}
/**
* Send data as self::send() plus add's \r\n
* @see self::send()
* @param string $data
*/
function sendLine($data=null){
return $this->send($data.self::NL);
}
/**
* Deletes a \n symbol from end
* @param string $line
* @return string
*/
function preParseLine($line)
{
$line=substr($line,0,strlen($line)-1);
return $line;
}
/**
* Convert char codes into symbols
* @param string $str
* @return string
*/
function convert($str)
{
//Parsing Russian Letters
$sympats = array(
"/\\\\320\\\\271/","/\\\\320\\\\260/","/\\\\320\\\\261/","/\\\\320\\\\262/","/\\\\320\\\\263/","/\\\\320\\\\264/","/\\\\320\\\\265/","/\\\\320\\\\221/","/\\\\320\\\\266/",
"/\\\\320\\\\267/","/\\\\320\\\\270/","/\\\\320\\\\271/","/\\\\320\\\\272/","/\\\\320\\\\273/","/\\\\320\\\\274/","/\\\\320\\\\275/","/\\\\320\\\\276/","/\\\\320\\\\277/",
"/\\\\321\\\\200/","/\\\\321\\\\201/","/\\\\321\\\\202/","/\\\\321\\\\203/","/\\\\321\\\\204/","/\\\\321\\\\205/","/\\\\321\\\\206/","/\\\\321\\\\207/","/\\\\321\\\\210/",
"/\\\\321\\\\211/","/\\\\321\\\\212/","/\\\\321\\\\213/","/\\\\321\\\\214/","/\\\\321\\\\215/","/\\\\321\\\\216/","/\\\\321\\\\217/",
"/\\\\320\\\\220/","/\\\\320\\\\221/","/\\\\320\\\\222/","/\\\\320\\\\223/","/\\\\320\\\\224/","/\\\\320\\\\225/","/\\\\320\\\\201/","/\\\\320\\\\226/","/\\\\320\\\\227/",
"/\\\\320\\\\230/","/\\\\320\\\\231/","/\\\\320\\\\232/","/\\\\320\\\\233/","/\\\\320\\\\234/","/\\\\320\\\\235/","/\\\\320\\\\236/","/\\\\320\\\\237/","/\\\\320\\\\240/",
"/\\\\320\\\\241/","/\\\\320\\\\242/","/\\\\320\\\\243/","/\\\\320\\\\244/","/\\\\320\\\\245/","/\\\\320\\\\246/","/\\\\320\\\\247/","/\\\\320\\\\250/","/\\\\320\\\\251/",
"/\\\\320\\\\252/","/\\\\320\\\\253/","/\\\\320\\\\254/","/\\\\320\\\\255/","/\\\\320\\\\256/","/\\\\320\\\\257/",
);
$alphabet = array(
"й","a","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я",
"А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я"
);
return preg_replace($sympats,$alphabet,$str);
}
/**
* EVENT HANDLERS
*/
function onDisconnect()
{
$this->_active=true;
$this->__construct($this->host,$this->port,$this->login,$this->pass,$this->channel);
}
function onRecieve($packets)
{
print "\r\n$packets";
}
function onChannelPing($nickname)
{
$this->sendLine("/me $nickname тут");
}
function onEnterChannel($nickname)
{
}
function onLeavesChannel($nickname)
{
}
}
$bot=new BnetBot('your server',6112,'telnetbot','yourpass','testchannel');
$bot->connect();
$patOnHere = "|^\[(\S+)\s+is\s+here\]\s+$|ixs";
$patOnJoin = "|^\[(\S+)\s+enters\]\s+$|ixs";
$patOnLeave = "|^\[(\S+)\s+leaves\]\s+$|ixs";
$patOnSay = "|^<(\S+)>(.*?)$|ixs";
$patOnWhisper = "|^<from\s(\S+)>(.*?)$|ixs";
$onChannel=array();
while(1)
{
$line=$bot->read();
$line=$bot->preParseLine($line);//Delete \r\n
$line=$bot->convert($line);//Convers codes into russian letters
print $line;
if(preg_match($patOnHere,$line,&$matOnHere))
{
// array('whole string','username who is here');
$onChannel[]=$matOnHere[1];
}
//parse On Join Event
if(preg_match($patOnJoin,$line, &$matOnJoin))
{
// array('whole string','username who join');
$bot->sendLine("/me {$matOnJoin[1]}, enters");
continue;
}
//parse On Leave Event
if(preg_match($patOnLeave,$line, &$matOnLeave))
{
// array('whole string','username who leaves');
$bot->sendLine("/me {$matOnLeave[1]}, leaves");
continue;
}
//parse On Say Event
if(preg_match($patOnSay,$line,&$matOnSay))
{
// array('whole string','username who say', 'what he say');
$bot->sendLine("{$matOnSay[1]} say - {$matOnSay[2]}");
sleep(0.5);
if($matOnSay[2]==="who") $bot->sendLine(implode(" | ",$onChannel))." <<<"; // try to display all users in channel when anybody say "who"
continue;
}
//parse On Whisper Event
if(preg_match($patOnWhisper,$line,&$matOnWhisper))
{
// array('whole string','username who whisper', 'what he whisper');
$bot->sendLine("{$matOnWhisper[1]} whisper - {$matOnWhisper[2]}");
continue;
}
}
$bot->close();
unset($bot);
Add a code snippet to your website: www.paste.org