Тема: [php] IRC Bot
Привіт всім!
Знайшов у себе свого старого IRC бота і вирішив поділитися з вами.
<?php
#####::::::::::::::::::::::::::::::::::::::
#####:::::: :::::::
#####::::::------[ UA ]iB0Tz--------:::::::
#####:::::: Version: Demo :::::::
#####:::::: Code by Russell S. :::::::
#####::::::-------------------------:::::::
#####:::::: :::::::
#####::::::::::::::::::::::::::::::::::::::
set_time_limit(0);
//:::::::::::::::[ Connection setings ]::::::::::::::://
$Conf = array();
$Conf['Serv'] = 'irc.intersvyaz.net';
$Conf['Port'] = '6667';
$Conf['Chan'] = '#fff';
$Conf['Nick'] = 'ToX1N';
$Conf['Ident'] = 'BoT';
$Conf['RealName'] = 'http://replace.org.ua';
$Conf['Pass'] = '';
//::::::::::::[ END - Connection setings ]::::::::::::://
class XSB {
//:::::::::::::::::[ MAIN Config ]:::::::::::::::::://
function XSB($chan, $nickname, $ident, $realname, $password) {
$this->nickname = $nickname;
$this->ident = $ident;
$this->realname = $realname;
$this->pass = $password;
$this->channels = $chan;
$this->admin_pas = "640bb86684722dcb46b976485433d02d"; // md5('r007'); коментар надалі видалити.
$this->OwnerHost = array();
$this->version = '[ UA ]iB0Tz vDemo |coded by Russell S.';
$this->md5file = 'db.txt';
$this->logFile = 'log.txt';
$this->botup = time();
$this->AVoice = TRUE; // Авто войс кожному що зайшов, false - off.
$this->AOp = FALSE; // Авто ОП кожному що зайшов
$this->AHop = FALSE; // Авто ХОП кожному що зайшов
$this->logon_pri = TRUE; // Включити логування привата
$this->logon_pub = TRUE; // Включити логування паблика
}
//::::::::::::::::[ END MAIN Config ]:::::::::::::::://
//______________________IRC & BOT API__________________________//
function connect($server, $port) {
$this->server = $server;
$this->port = $port;
$this->irc = fsockopen($this->server,$this->port);
fputs($this->irc, "PASS $this->pass \r\n");
sleep(0.5);
fputs($this->irc, "NICK $this->nickname \r\n");
sleep(0.5);
fputs($this->irc, "USER $this->ident 8 * : $this->realname \r\n");
sleep(0.3);
fputs($this->irc, "PONG\r\n");
echo "Connected to $this->server on port $this->port\n";
sleep(0.2);
}
function quit($reason) {
fputs($this->irc, "QUIT :$reason\r\n");
echo "Closed connection to $this->server\n";
die("Bot mode: Stop");
}
function join($channel) {
fputs($this->irc, "JOIN $channel\r\n");
echo "Joined $channel on server $this->server\n";
}
function part($channel) {
fputs($this->irc, "PART $channel\r\n");
echo "Left from $channel on server $this->server\n";
}
function pong_reply() {
if(preg_match("#^PING#", $this->buffer)) {
fputs($this->irc, "PONG");
sleep(0.2);
echo "Sent PONG reply through socket.\n";
}
}
function say($channel, $text) {
fputs($this->irc, "PRIVMSG $cnannel \r\n");
fputs($this->irc, "PRIVMSG $channel : $text \r\n");
}
function notice($nick, $text) {
fputs($this->irc, "NOTICE $nick $text\r\n");
}
function mode($channel,$nick,$mode) {
$m='';
switch($mode)
{
case 'v': $m = "MODE $channel +v $nick\r\n";
break;
case 'h': $m = "MODE $channel +h $nick\r\n";
break;
case 'o': $m = "MODE $channel +o $nick\r\n";
break;
case 'dv': $m = "MODE $channel -v $nick\r\n";
break;
case 'dh': $m = "MODE $channel -h $nick\r\n";
break;
case 'do': $m = "MODE $channel -o $nick\r\n";
break;
}
fputs($this->irc, $m);
}
function make_rand() {
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
// Check admin HOST
function check_host($string) {
foreach($this->OwnerHost as $CmdH) {
if($string == $CmdH){
$res = TRUE;
} else {
$res = FALSE;
}
}
return $res;
}
// Запис в лог файл.
function write_log($string) {
$fhandle = fopen($this->logFile,'a');
if($fhandle) {
fwrite($fhandle, $string."\n");
fclose($fhandle);
}
}
//_____________________ EnD IRC & BOT API_______________________//
//_______________________Encrypting_______________________//
function get_base($string){
return ("-- base64 for \"$string\" is ".base64_encode($string));
}
function get_base_dec($string){
return ("-- base64 decode for \"$string\" is ".base64_decode($string));
}
function get_sha1($string) {
return ("-- sha1 encode for \"$string\" is ".sha1($string));
}
function fill_db($string) {
clearstatcache();
$handle = fopen($this->md5file, 'r');
$content = fread($handle, filesize($this->md5file));
if(!preg_match("#".md5($string)."#", $content)) {
$handle = fopen($this->md5file, 'a');
fwrite($handle, $string."/".md5($string)."\n");
}
fclose($handle);
return "-- md5 for \"$string\" is ".md5($string);
}
//_____________________End Encrypting______________________//
// Generator of Password
function pass_gen($arg,$numb) {
$pass='';
if(!preg_match("/^[0-9]+$/", $numb, $out)) {
return "Я не розумію символи, тільки цифри >.<";
}
if($numb > 50){
return "Перевищує ліміт 50 іимволів !";
}
$a_ch = array('Q','W','E','R','T','Y','U','I',
'O','P','A','S','D','F','G','H',
'J','K','L','Z','X','C','V','B',
'N','M',
'q','w','e','r','t','y','u','i',
'o','p','a','s','d','f','g','h',
'j','k','l','z','x','c','v','b',
'n','m',
'1','2','3','4','5','6','7','8',
'9','0',
'!','@','#','$','%','^','&','*',
'(',')','{','}',':',';');
switch($arg){
case 'a':
for($i=0;$i<$numb;$i++){
$pass .= $a_ch[(rand(0,count($a_ch)-1))];
}
return $pass; break;
case 'b':
for($i=0;$i<$numb;$i++){
$pass .= $a_ch[rand(0,25)];
}
return $pass; break;
case 's':
for($i=0;$i<$numb;$i++){
$pass .= $a_ch[rand(26,51)];
}
return $pass; break;
case 'i':
for($i=0;$i<$numb;$i++){
$pass .= $a_ch[rand(52,61)];
}
return $pass; break;
case 'c':
for($i=0;$i<$numb;$i++){
$pass .= $a_ch[rand(62,75)];
}
return $pass; break;
default: return "Mode incorrect";
}
}
// Get PageRank(google)
function get_pr($string) {
$query='http://www.eomy.net/google-pagerank/'.$string;
$page=file_get_contents($query);
preg_match_all('|\s:\s(.+)<|Uis', $page, $result);
if(empty($result[1][0])) {
return "Not Found Oo";
} else {
return "Page Rank for \"$string\": ".$result[1][0];
}
}
// Get CY ( yandex )
function get_cy($string) {
$query='http://search.yaca.сайт-злодій/yca/cy/ch/'.$string;
$page=file_get_contents($query);
preg_match_all('|151;\s(.+)<|Uis', $page, $result);
if(empty($result[1][0])) {
return "Not Found Oo";
} else {
return "CY(yandex) for \"$string\": ".$result[1][0];
}
}
// Get proxy list
function get_proxy() {
$query='http://www.proxy-list.net/anonymous-proxy-lists.shtml';
$page = file_get_contents($query);
preg_match_all('|><pre>(.*)<|Uis',$page,$result);
return explode("\n",$result[1][0]);
}
// Get hash encode
function eser_md5($string) {
if(empty($string)) {
return "Enter HASH";
}
$query='http://gdataonline.com/qkhash.php?mode=txt&hash='.$string;
$page = file_get_contents($query);
preg_match_all('|\"35%\"><b>(.*)<|Uis',$page,$result);
if(empty($result[1][0])) {
return "Text for this hash not found ^_^";
} else {
return "Text for \"".$string."\" is \"".$result[1][0]."\"";
}
}
// Get INFO From whois.ripe.net
function get_whois($server="whois.ripe.net", $query) {
$sockh=fsockopen($server, 43);
if(!$sockh){
return "Connection to whois.ripe.net Error";
}
fputs($sockh, $query."\r\n");
while(!feof($sockh)) {
$recv .= fread($sockh, 1024);
}
fclose($sockh);
return explode("\n",$recv);
}
// Searching and parse YANdEX.
function get_yan($string) {
if(empty($string)) {
return "^_^";
}
$query = 'http://сайт-злодій/yandsearch?rpt=rad&text='.$string;
$page = file_get_contents($query);
preg_match_all('|\'\);\"\shref=\"(.*)\"|Uis',$page,$result);
return $result;
}
// Quotes from the BASH.ORG.RU
function get_bash(){
$page = file_get_contents('http://bash.org.ru/random');
preg_match_all('|<div>(.+)</div>|',$page,$result);
$quo = preg_replace('/<br>|<br \/>/','~',$result[1][1]);
return explode("~",$quo);
}
// Приветстуем нового Юзера
function say_hello($nick) {
$say_txt = array("Hello","Re","Hi","h1","Хакір прийшов == >","O_O","Плівііііт","ку","hey","@]-->-------","Пріва ","Здаровка","Приветствуем","heya");
srand($this->make_rand());
$msg = $say_txt[rand(1, count($say_txt))]." ".$nick;
return $msg;
}
// Отобразить аптайм бота
function get_uptime($on) {
$sec = ($on - time());
$min = 0;
$hr = 0;
if($sec >= 60) {
$min = $sec / 60;
if($min >= 60) {
$hr = $min / 60;
return ("Bot uptime: ".$hr." hrs.");
}
else {
return("Bot uptime: ".$min." mins.");
}
} else {
return("Bot uptime: ".$sec." secs.");
}
}
//____________________Обработка событий______________________//
function cmds() {
$pattern[1] = "#^:(.+)!(.+)@(.+)\s(.+)\s(.+)\s:(.+)$#"; // Маска для повідомлень в чаті
$pattern[2] = "#^:(.+)!(.+)@(.+)\s(.+)\s:(.+)$#"; // Маска для повідомлень типу JOIN,QUIT,NOTICE
## Обробка системних повідомлень ##
if(preg_match($pattern[2], $this->buffer, $out)) {
$eve_nick = $out[1];
$eve_ev = $out[4];
$eve_canal = trim($out[5]);
// Вітаємо нового юніта
if(preg_match("#^JOIN#",$eve_ev)) {
if($eve_nick == $this->nickname){
$this->say($eve_canal,$this->version);
sleep(0.2);
} else {
$this->say($eve_canal,$this->say_hello($eve_nick));
if($this->AVoice == TRUE) {
$this->mode($eve_canal,$eve_nick,"v");
}
if($this->AOp == TRUE) {
$this->mode($eve_canal,$eve_nick,"o");
}
if($this->AHop == TRUE) {
$this->mode($eve_canal,$eve_nick,"h");
}
}
}
}
## Обробка повідомлень від користувачів ##
if(preg_match($pattern[1], $this->buffer, $out)) {
$is_private = FALSE;
$sender_nick = $out[1];
$sender_ident = $out[2];
$sender_host = $out[3];
$cmd = $out[4];
$canal = $out[5];
$msg = $out[6];
// Команди які потрібно писати в приват.
if($canal == $this->nickname) {
$canal = $sender_nick;
// Логін на каналі
if(preg_match("#^.login\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->say($canal, "Ви вже представилися боту ^_^");
}
elseif(md5(trim($out[1])) == $this->admin_pas) {
$this->say($canal, "Welcome, $sender_nick !!!");
$this->OwnerHost[count($this->OwnerHost)+1] = trim($sender_host);
}
else {
$this->say($canal,"Невірний пароль О_О");
}
}
// Сказати на канал.
if(preg_match("#^.say\s(.+)#", $msg, $out)) {
$this->say($this->channels, trim($out[1]));
}
// Вимкнення бота (Требуеться авторизація).
if(preg_match("#^.halt\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->quit(trim($out[1]));
}
else {
$this->say($sender_nick, "Ви не ввійшли, введіть пароль!");
}
}
// Пишемо лог, не пишеться у випадку команди логін
if(($this->logon_pri) && (!preg_match("#^.login\s(.+)#", $msg, $out))) {
$this->write_log($canal."[pri] - ".$sender_nick."@".$sender_host.": ".$msg);
}
// Команди доступні в паблік чату.
} else {
// Пишемо лог
if($this->logon_pub) {
$this->write_log($canal."[pub] - ".$sender_nick."@".$sender_host.": ".$msg);
}
// Відобразити налаштування бота.
if(preg_match("#!show_conf#", $msg, $out )) {
if($this->check_host(trim($sender_host))) {
$this->say($sender_nick,"=== > Config");
$this->say($sender_nick,"->logFile = ".$this->logFile);
$this->say($sender_nick,"->AVoice = ".(($this->AVoice)?"True":"False"));
$this->say($sender_nick,"->AOp = ".(($this->AOp)?"True":"False"));
$this->say($sender_nick,"->AHop = ".(($this->AHop)?"True":"False"));
$this->say($sender_nick,"->logon_pri = ".(($this->logon_pri)?"True":"False"));
$this->say($sender_nick,"->logon_pub = ".(($this->logon_pub)?"True":"False"));
$this->say($sender_nick,"=== > EOF");
} else {
$this->say($canal,"недостатньо прав");
}
}
// Показати список залогуваних.
if(preg_match("#!show_a#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->say($sender_nick,"ACCESS LIST:");
foreach($this->OwnerHost as $CmdRaw) {
$this->say($sender_nick,"Host: ".$CmdRaw);
sleep(0.5);
}
} else {
$this->say($canal,"У вас недостатньо прав щоб скористатися цією функцією");
}
}
// Поставити режим ОПА юзеру (Требуеться авторизація)
if(preg_match("#!op\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->mode($canal,trim($out[1]),'o');
} else {
$this->say($canal,"У тебе недостатньо прав ^_^");
}
}
// Зняти режим ОПА з юзера (Потрібна авторизація)
if(preg_match("#!deop\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->mode($canal,trim($out[1]),'do');
} else {
$this->say($canal,"У тебе недостатньо прав ^_^");
}
}
// Дати користувачеву ПолуОпа (Потрібна авторизація)
if(preg_match("#!ho\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->mode($canal,trim($out[1]),'h');
} else {
$this->say($canal,"У тебе недостатньо прав ^_^");
}
}
// Зняти з користувача ПолуОпа (Потрібна авторизація)
if(preg_match("#!deho\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->mode($canal, trim($out[1]),'dh');
} else {
$this->say($canal,"У тебе недостатньо прав ^_^");
}
}
// Дати користувачеві Войс (Потрібна авторизація)
if(preg_match("#!vo\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->mode($canal,trim($out[1]),'v');
} else {
$this->say($canal,"У тебе недостатньо прав ^_^");
}
}
// Зняти войся з юзера (Потрібна авторизація)
if(preg_match("#!devo\s(.+)#", $msg, $out)) {
if($this->check_host(trim($sender_host))) {
$this->mode($canal, trim($out[1]),'dv');
} else {
$this->say($canal,"У тебе недостатньо прав ^_^");
}
}
// Password generator
if(preg_match("#!passgen\s-p\s(.+)\s-c\s(.+)#", $msg, $out)){
$this->say($canal,"Password: ".$this->pass_gen(trim($out[1]),trim($out[2])));
sleep(0.5);
}
// Proxy lists
if(preg_match("#!proxy#", $msg, $out)) {
$res = $this->get_proxy();
$this->say($canal," --> Proxy L1ST <--");
for($i=0;$i<=5;$i++) {
$this->say($canal, $res[$i]);
sleep(0.5);
}
}
// Get PageRank(google)
if(preg_match("#!pr\s(.+)#", $msg, $out)) {
$this->say($canal, $this->get_pr(trim($out[1])));
sleep(0.2);
}
// Get CY(yandex)
if(preg_match("#!cy\s(.+)#", $msg, $out)) {
$this->say($canal, $this->get_cy(trim($out[1])));
sleep(0.2);
}
// Search MD5 hash
if(preg_match("#!ser_md5\s(.+)#", $msg, $out)) {
$this->say($canal, $this->eser_md5(trim($out[1])));
sleep(0.2);
}
// Whois NetRip
if(preg_match("#!whois\s(.+)#", $msg, $out)) {
$who_host = gethostbyname(trim($out[1]));
foreach($this->get_whois("whois.ripe.net", $who_host) as $CmdRaw) {
$this->notice($sender_nick, $CmdRaw);
sleep(0.6);
}
$this->say($canal,"Info from the ripe.net sended to $sender_nick");
}
// Bot uptime :)
if(preg_match("#^!uptime#", $msg, $out)) {
$this->say($canal, $this->get_uptime($this->botup));
sleep(0.3);
}
// Search in сайт-злодій
if(preg_match("#^!finde\s(.+)#", $msg, $out)) {
$CmdRaw = $this->get_yan(trim($out[1]));
for($i=1;$i<=5;$i++) { // $i - Вказує на кількість виведених лінків
$this->say($canal, $CmdRaw[1][$i]);
sleep(0.7);
}
}
// sha1 encode
if(preg_match("#^!sha1\s(.+)#", $msg, $out)) {
$this->say($canal, $this->get_sha1(trim($out[1])));
}
// Base encode
if(preg_match("#^!en_base\s(.+)#", $msg, $out)) {
$this->say($canal, $this->get_base(trim($out[1])));
}
// Base64 decode
if(preg_match("#^!de_base\s(.+)#", $msg,$out)) {
$this->say($canal, $this->get_base_dec(trim($out[1])));
}
// DEAUTH
if(preg_match("#^.deauth#", $msg) && $is_private == TRUE) {
if($sender_host == $this->OwnerHost) {
$this->OwnerHost = '';
$this->say($canal, "Die.");
}
else {
$this->say($canal, "You should be authed.");
}
}
// VERSION
if(preg_match("#^.ver#", $msg)) {
$this->say($canal, $this->version);
}
// HELP (
if(preg_match("#^.help#", $msg)) {
$this->CmdList[1] = '---- Commands for [ XS ]iB0Tz ----';
$this->CmdList[2] = '!finde <text> :: Пошук по запиту';
$this->CmdList[3] = '!ser_md5 <text> :: Пошук хешу по базах ';
$this->CmdList[4] = '!md5 <text> :: Отримати md5 хеш ';
$this->CmdList[5] = '!sha1 <text> :: Отримати sha1 хеш ';
$this->CmdList[6] = '!en_base <text>:: Кодувати в base64';
$this->CmdList[7] = '!de_base <text> :: Декодувати з base64';
$this->CmdList[8] = '!say <text> :: Сказати на канал.';
$this->CmdList[9] = '!whois <text> :: whois service';
$this->CmdList[10] = '!cy <text> :: ТИц( yandex )';
$this->CmdList[11] = '!pr <text> :: View PageRank';
$this->CmdList[12] = '!ver :: Поточна версія бота.';
$this->CmdList[13] = '!proxy :: Список проксі';
$this->CmdList[14] = '!bash :: Цитата з BASH.ORG.RU';
$this->CmdList[15] = '!uptime :: Час життя бота в онлайні';
$this->CmdList[16] = '!passgen -p [a|b|s|i|c] -c [numb of chars]';
$this->CmdList[17] = ':: Генератор пароля ключ -p';
$this->CmdList[18] = ': a - Пароль складається з усіх символів і цифр';
$this->CmdList[19] = ': b - Пароль складається з символів верхнього регістру';
$this->CmdList[20] = ': s - Пароль складається з символів нижнього регістру';
$this->CmdList[21] = ': i - Пароль складається з цифр';
$this->CmdList[22] = ': c - Пароль складається з спецсимволів';
$this->CmdList[23] = ': Після ключа -с йде кількість символів.';
$this->CmdList[24] = '---- Command for [ ACCESS LIST ] ----';
$this->CmdList[25] = '!op <nick> :: Дати опа юзеру';
$this->CmdList[26] = '!deop <nick> :: Зняти опа з юзера';
$this->CmdList[27] = '!ho <nick> :: Дати ПолуОпа юзеру';
$this->CmdList[28] = '!deho <nick> :: Зняти ПолуОпа з юзера';
$this->CmdList[29] = '!vo <nick> :: Дати юзеру Войс';
$this->CmdList[30] = '!devo <nick> :: Зняти войс з юзера';
$this->CmdList[31] = '!show_a :: Показати список залогіневшіхся';
$this->CmdList[32] = '!login <pass> :: Авторизація';
$this->CmdList[33] = '!halt <text> :: Вихід бота.';
$this->CmdList[34] = '!join <channel> :: Бот заходить на зазначений канал';
$this->CmdList[35] = '!part <channel> :: Бот покидає зазначений канал';
$this->CmdList[36] = '!show_conf :: Відобразити налаштування бота';
foreach($this->CmdList as $CmdRaw) {
$this->notice($sender_nick, $CmdRaw);
sleep(0.6);
}
}
// Цитата з Башорга
if(preg_match("#!bash#",$msg,$out)) {
$quote = array();
$quote = $this->get_bash();
$this->say($canal,"[ ----------- BASH.ORG ------------ ]");
sleep(0.5);
foreach($quote as $CmdRaw) {
$this->say($canal,html_entity_decode(urldecode($CmdRaw)));
sleep(0.6);
}
$this->say($canal,"[ --------- END BASH.ORG ---------- ]");
}
if(preg_match("#^.join\s(.+)#", $msg, $out)) {
if($this->Check_host($sender_host)) {
$this->join(trim($out[1]));
$this->say($canal, "Joined ".trim($out[1]));
}
else {
$this->say($sender_nick, "Недостатньо прав!");
}
}
if(preg_match("#^.part\s(.+)#", $msg, $out)) {
if($this->Check_host($sender_host)) {
$this->part(trim($out[1]));
$this->say($canal, "Left ".trim($out[1]));
}
else {
$this->say($sender_nick, "Недостатньо прав!");
}
}
if(preg_match("#^!md5\s(.+)#", $msg, $out)) {
$this->say($canal, $this->fill_db(trim($out[1])));
}
}
}
}
function loop() {
while(TRUE) {
$this->buffer = fgets($this->irc, 1024);
echo $this->buffer;
$this->cmds();
$this->pong_reply();
}
}
}
$IB = new XSB($Conf['Chan'], $Conf['Nick'], $Conf['Ident'], $Conf['RealName'], $Conf['Pass']);
$IB->connect($Conf['Serv'], $Conf['Port'] );
$IB->join($Conf['Chan']);
$IB->loop();
?>
Налаштування з'єднань, тут думаю питань не буде
$Conf['Serv'] = 'irc.intersvyaz.net';
$Conf['Port'] = '6667';
$Conf['Chan'] = '#fff';
$Conf['Nick'] = 'ToX1N';
$Conf['Ident'] = 'BoT';
$Conf['RealName'] = 'http://replace.org.ua';
$Conf['Pass'] = '';
Конфіг дуже простий вам тільки потрібно вказати пароль для адміністратора.
$this->admin_pas = "640bb86684722dcb46b976485433d02d"; // md5('r007'); коментар надалі видалити.
Приємного використання, пані та панове ! :cool: