#
Ross Markham's PHP IRC bot was made for a challenge #
& pure fun. It has a few features. private message #
the bot for a command list. It was written to be as #
easy as possable to update/improve. feel free to #
use and modify as you see fit. #
###################################################*/
set_time_limit(0); //Stop the script timing out
$server = "irc.somewhere.com"; //server to connect to
$channel = "#bottest"; //channel to connect to initialy
$password = "password"; //password for bot to login to irc
$pass2 = "password"; //password to make the bot do stuff
$users[0] = "0"; //array of logged in users
$nickname = "[bot1]"; //Set the bot's nick here
$logger = FALSE; //for the channel logger
$takeover = FALSE; //for the auto banner
$socket=fsockopen($server,'6667') ; //Connect and join the channel
stream_set_timeout($socket, 300); //Set a timeout value (so the bot quits if it's disconnected)
fwrite($socket, "NICK ".$nickname."\r\n");
fwrite($socket, "USER ".$nickname." 8 * ::\x01VERSON 1.0 Ross's bot\x01\n"); //read rfc 1459 to understand this line
while ($line=fgets($socket)) {
echo htmlentities($line)."
";
if (strpos($line, "433")>0) die("error nick in use"); //Quit if bot's nick is already taken (irc code 433 is received)
if (strpos($line, "004")>0) {
fwrite($socket, "JOIN ".$channel."\r\n"); //Join the channel if everything is ok (irc code 004 is received)
break;
}
}
//Read messages and respond appropriately
while ($line=fgets($socket)) {
echo htmlentities($line)."
"; //output the line to the screen
//Respond to pings
if (strpos($line,"PING :")===0) {
fwrite($socket, "PONG :".substr($line,6)."\r\n");
continue;
}
//respond to ctcp version
if (strpos($line, "PRIVMSG ".$nickname." :\001VERSION\001\r\n")>0){
$nick = substr($line, 0, strpos($line, "!"));
$nick = str_replace(":", "", $nick );
fwrite($socket, "NOTICE ".$nick." :\001VERSON 1.0 Nanoy's bot\001\r\n");
}
//rejoin when kicked
if (strpos($line, "KICK ".$channel." ".$nickname)>0){
fwrite($socket, "JOIN ".$channel."\r\n");
}
//de-ban when banned
if (strpos($line, "MODE ".$channel." +b")>0){
$extension = strstr($line, "*!*@");
$extension = str_replace("*!*@", "", $extension );
fwrite($socket, "MODE ".$channel." -b *!*@".$extension."\r\n");
}
//channel logger
if ((strpos($line, "PRIVMSG ".$channel." :")>0)&& ($logger == TRUE)){
$fp = fopen("bot_IRC_logs.txt", 'a');
fwrite($fp,"".$line."");
fclose($fp);
}
//auto de-op (in takeover mode)
if ((strpos($line, "MODE ".$channel." +o")>0)&&($takeover == TRUE)){
$opped = strstr($line, "+o ");
$opped = str_replace("+o ", "", $opped);
$opped = trim($opped, "\x00..\x1F");
if (strpos($opped, "nm_")==0){
fwrite($socket, "MODE ".$channel." -voh ".$opped." ".$opped." ".$opped."\r\n");
}
}
//auto op (in takeover mode)
if ((strpos($line, "MODE ".$channel." -o")>0)&&($takeover == TRUE)){
$opped = strstr($line, "+o ");
$opped = str_replace("+o ", "", $opped);
$opped = trim($opped, "\x00..\x1F");
if (strpos($opped, "nm_")>0){
fwrite($socket, "MODE ".$channel." +voh ".$opped." ".$opped." ".$opped."\r\n");
}
}
//takeover channel
if ((strpos($line, $server." 353")>0)&&($takeover == TRUE)){
$line = str_replace(":".$server." 353 ".$nickname." = ".channel." :", "", $line);
$pieces = explode(" ", $line);
$amount = count($pieces);
for ( $i = 0; $i <= $amount; $i++){
$pieces[$i] = str_replace("@", "", $pieces[$i] );
if (strpos($pieces[$i], "nm_")>0){
fwrite($socket, "MODE ".$channel." +voh ".$pieces[$i]." ".$pieces[$i]." ".$pieces[$i]."\r\n");
}else{
fwrite($socket, "MODE ".$channel." -voh ".$pieces[$i]." ".$pieces[$i]." ".$pieces[$i]."\r\n");
}
}
$autoban = FALSE;
}
//###########################################################
// PRIVATE MESSAGE COMMANDS
//###########################################################
if (strpos($line, "PRIVMSG ".$nickname."")>0){
$nick = substr($line, 0, strpos($line, "!"));
$nick = str_replace(":", "", $nick );
//command help
if (strpos($line, "PRIVMSG ".$nickname." :help")>0){
fwrite($socket, "PRIVMSG ".$nick." :pwd : log into me\r\n");
fwrite($socket, "PRIVMSG ".$nick." :die ".$nickname.": make me leave irc\r\n");
fwrite($socket, "PRIVMSG ".$nick." :logon: make me logon to irc server\r\n");
fwrite($socket, "PRIVMSG ".$nick." :say : say in the current channel\r\n");
fwrite($socket, "PRIVMSG ".$nick." :md5 : md5 in current channel\r\n");
fwrite($socket, "PRIVMSG ".$nick." :move to : move to \r\n");
fwrite($socket, "PRIVMSG ".$nick." :kick : set -voh then kick (de-op,kick)\r\n");
fwrite($socket, "PRIVMSG ".$nick." :op : I will set status to +voh\r\n");
fwrite($socket, "PRIVMSG ".$nick." :de-op : I will set status to -voh\r\n");
fwrite($socket, "PRIVMSG ".$nick." :takeover: toggle takeover on/off\r\n");
fwrite($socket, "PRIVMSG ".$nick." :show users: show all logged in users\r\n");
fwrite($socket, "PRIVMSG ".$nick." :flood : flood the channel with ascii art times\r\n");
fwrite($socket, "PRIVMSG ".$nick." :change nick : change my nickname to \r\n");
fwrite($socket, "PRIVMSG ".$nick." :only me: make you the only user\r\n");
fwrite($socket, "PRIVMSG ".$nick." :channel logger: turns channel logger on/off\r\n");
}else
//become a user (password)
if (strpos($line, "PRIVMSG ".$nickname." :pwd ")>0){
$pwd = strstr ($line, "pwd ");
$pwd = str_replace("pwd ", "", $pwd );
$pwd = trim($pwd, "\x00..\x1F");
if ($pwd == $pass2){
$users[0] = $users[0] + 1;
$users[$users[0]] = $nick;
fwrite($socket, "PRIVMSG ".$nick." :Access granted\r\n");
}else{
fwrite($socket, "PRIVMSG ".$nick." :Access denied\r\n");
}
}else
//check if $nick is a user
$user = FALSE;
for ( $i = 0; $i <= $users[0]; $i++) {
if ($users[$i] == $nick){
$user = TRUE;
}
}
if (($user == FALSE)&&((strpos($line, "PRIVMSG ".$nickname." :pwd ")==0))&&((strpos($line, "PRIVMSG ".$nickname." :help")==0))){
fwrite($socket, "PRIVMSG ".$nick." :You are not in control of me, you can only use 'help' & 'pwd'\r\n");
}else
//quit
if (strpos($line, "PRIVMSG ".$nickname." :die ".$nickname."\r\n")>0) {
fwrite($socket, "PRIVMSG ".$nick." :joo awe a meeeeny!!!\r\n");
break;
}else
//logon
if (strpos($line, "PRIVMSG ".$nickname." :logon")>0){
fwrite($socket, "PRIVMSG NickServ IDENTIFY ".$password."\r\n");
fwrite($socket, "PRIVMSG ".$nick." :Logged in.\r\n");
}else
//say in channel
if (strpos($line, "PRIVMSG ".$nickname." :say ")>0){
$newstring = strstr ($line, "say ");
$newstring = str_replace("say ", "", $newstring );
$newstring = trim($newstring, "\x00..\x1F");
fwrite($socket, "PRIVMSG ".$channel." :".$newstring."\r\n");
}else
//md5 a string
if (strpos($line, "PRIVMSG ".$nickname." :md5 ")>0){
$md5 = strstr($line, "md5 ");
$md5 = str_replace("md5 ", "", $md5 );
$md5 = trim($md5, "\x00..\x1F");
$string = $md5;
$md5 = md5($md5);
fwrite($socket, "PRIVMSG ".$channel." :MD5 for ".$string." is: ".$md5."\r\n");
}else
//change channel
if (strpos($line, "PRIVMSG ".$nickname." :move to #")>0){
$oldchannel = $channel;
$channel = strstr($line, "move to #");
$channel = str_replace("move to ", "", $channel );
$channel = trim($channel, "\x00..\x1F");
fwrite($socket, "PART ".$oldchannel."\r\n");
fwrite($socket, "JOIN ".$channel."\r\n");
}else
//kick someone
if (strpos($line, "PRIVMSG ".$nickname." :kick ")>0){
$victim = strstr($line, "kick ");
$victim = str_replace("kick ", "", $victim );
fwrite($socket, "MODE ".$channel." -voh ".$victim." ".$victim." ".$victim."\r\n");
fwrite($socket, "KICK ".$channel." ".$victim." :lol\r\n");
}else
//give operator status
if (strpos($line, "PRIVMSG ".$nickname." :op")>0){
$op = strstr($line, "op ");
$op = str_replace("op ", "", $op);
$op = trim($op, "\x00..\x1F");
fwrite($socket, "MODE ".$channel." +voh ".$op." ".$op." ".$op."\r\n");
}else
//shows all logged in users
if (strpos($line, "PRIVMSG ".$nickname." :show users\r\n")>0){
fwrite($socket, "PRIVMSG ".$nick." :logged in users are:\r\n");
for ( $i = 1; $i <= $users[0]; $i++) {
fwrite($socket, "PRIVMSG ".$nick." :".$users[$i]."\r\n");
}
}else
//flood the channel
if (strpos($line, "PRIVMSG ".$nickname." :flood ")>0){
$no = strstr($line, "flood ");
$no = str_replace("flood ", "", $no );
$no = trim($no, "\x00..\x1F");
fwrite($socket, "PRIVMSG ".$nick." :flooding!\r\n");
for ( $i = 1; $i <= $no; $i++) {
fwrite($socket, "PRIVMSG ".$channel." :14,11 . '@(@@@@@@@)@. (@@) ` . ' \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 . @@'((@@@@@@@@@@@)@@@@@)@@@@@@@)@ \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 @@(@@@@@@@@@@))@@@@@@@@@@@@@@@@)@@` . \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 @.((@@@@@@@)(@@@@@@@@@@@@@@))@8,8\\14,11@@@@@@@@@)@@@ . \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 (@@@@@@@@@@@@@@@@@@)@@@@@@@@@@@8,8\\\\14,11@@)@@@@@@@@) \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 (@@@@@@@@)@@@@@@@@@@@@@(@@@@@@@@8,8//14,11@@@@@@@@@) ` \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 .@(@@@@)##&&&&&(@@@@@@@@)::_=(@8,8\\\\14,11@@@@)@@ . .' \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 @@`(@@)###&&&&&!!;;;;;;::-_=@@8,8\\\\14,11@)@`@. \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 ` @@(@###&&&&!!;;;;;::-=_=@.@8,8\\\\14,11@@ ' \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 ` @.#####&&&!!;;;::=-_= .@11 8,8\\\\14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 ####&&&!!;;::=_- 8,8`14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 ###&&!!;;:-_= \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 ##&&!;::_= \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 ##&&!;:= 12I FEEL14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 ##&&!:- 12 14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 #&!;:- 12A14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 #&!;= 12 14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 #&!- 12STORM14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 #&= 12 14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 #&- 12BREWING ! ! !14,11 \r\n");
fwrite($socket, "PRIVMSG ".$channel." :14,11 \\#\/' \r\n");
fwrite($socket, "PRIVMSG ".$channel." :9,3 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n");
}
}else
//take operator status
if (strpos($line, "PRIVMSG ".$nickname." :de-op ")>0){
$op = strstr($line, "de-op ");
$op = str_replace("de-op ", "", $op);
$op = trim($op, "\x00..\x1F");
fwrite($socket, "MODE ".$channel." -voh ".$op." ".$op." ".$op."\r\n");
}else
//change nick
if (strpos($line, "PRIVMSG ".$nickname." :change nick ")>0){
$nickname = strstr($line, "change nick ");
$nickname = str_replace("change nick ", "", $nickname);
$nickname = trim($nickname, "\x00..\x1F");
fwrite($socket, "NICK ".$nickname."\r\n");
}else
//removes all other users & clears up array (usefull for when you change your nick)
if (strpos($line, "PRIVMSG ".$nickname." :only me\r\n")>0){
for ( $i = 1; $i <= $users[0]; $i++) {
$users[$i] = "";
fwrite($socket, "PRIVMSG ".$users[$i]." :You have been removed from my userlist by ".$nick."\r\n");
}
$user2[0] = "1";
$users[1] = $nick;
fwrite($socket, "PRIVMSG ".$nick." :you are now my only user\r\n");
}else
//channel logger
if (strpos($line, "PRIVMSG ".$nickname." :channel logger\r\n")>0){
if ($logger == FALSE){
$logger = TRUE;
$date = date("d/m/y");
$fp = fopen("bot_IRC_logs.txt", 'a');
fwrite($fp,"##################################################\r\n");
fwrite($fp,"##Logs started: ".$date." in: ".$channel."\r\n");
fwrite($fp,"##################################################\r\n");
fclose($fp);
fwrite($socket, "PRIVMSG ".$nick." :channel logger activated\r\n");
}else{
$logger = FALSE;
fwrite($socket, "PRIVMSG ".$nick." :channel logger de-activated\r\n");
}
}else
//takeover mode
if (strpos($line, "PRIVMSG ".$nickname." :takeover\r\n")>0){
if ($takeover == FALSE){
$takeover = TRUE;
fwrite($socket, "PRIVMSG ".$nick." :takeover activated\r\n");
fwrite($socket, "NAMES ".$channel."\r\n");
}else{
$takeover = FALSE;
fwrite($socket, "PRIVMSG ".$nick." :takeover de-activated\r\n");
}
}else
{
//respond to ctcp version
//fwrite($socket, "NOTICE ".$nick." :".chr(1)."VERSION 1.0 Ross's bot".chr(1));
}
}
}
?>