PHP IRC Bot
Alright. I have made a PHP IRC Bot to run on my network but recently I took down my network for a while so I can find out how to link another server to it. So, to start off you will need to modify some things.
This bot has been coded in all OOP with a very simple database wrapper that you can always edit at a later point in time to something better.
To start off, php has to be installed on your computer. You may also need MySQL installed for a later section of this tutorial which will manage channel modes and a simple game.
If they are installed, you will want to make PHP accessible from anywhere on the computer. To achieve this you will need to edit the environmental variable named Path. To do this, you can follow the simple steps below.
- Start -> Right click My Computer
- Left click Properties
- Select the advanced tab
- Click the "Environmental Variables" button down near the bottom of the screen
After doing that, a small screen will appear that contains all your environmental variables.
We will be altering one of the System variables named Path. Select the variable then click the Edit button.
At the end of the line add the following
After you do that you will need to restart your computer for these changes to take effect.
Next, you are ready to start making the bot.
Lets create a new directory and name it Extensions, or just ext.
After you have done that in the root directory make a file named YourBot.php
In this file will be all your core settings for the bot and MySQL. I have mine set up so its all run in the PHP CLI.
So, now to start the code.
<?php
require("ext/botCore.php");
$YourBot = new botCore();
$MySQL_Config = array(
"sql_host" => "localhost", //MySQL Host
"sql_user" => "root", //MySQL user
"sql_pass" => "", //MySQL Pass
"sql_data" => "test" //MySQL Database
);//end MySQL Configuration
$mIRC_Config = array(
"irc_server" => "irc.freenode.net", //IRC Network to connect to
"irc_port" => "6667", //IRC Port
"irc_nick" => "YourBot", //Bot name
"irc_pass" => "", //Bot password for ident
"irc_host" => "rmb-scripting.com", //the bots host
"irc_real" => "Your Bot", //Bots real name
"irc_defchan" => "#YourChannel" //default channel to join.
);
$YourBot->botConnect($MySQL_Config, $mIRC_Config);
?>
Next, in your ext folder you will want to make the file botCore.php
In this file, you will want to place the following.
<?php
set_time_limit(0); //Don't time the script out
require ("botExt.php"); //get the bot extension for different things like channel commands.
class botCore extends botExt //Lets extend the bot extensions
{
private $mIRC_Socket; //This is the bots socket
private $mIRC_Config; //This is the bots configuration settings
function botConnect($MySQL_Config = null, $mIRC_Config = null) //lets have our bot connect.
{
$this->mIRC_Config = $mIRC_Config; //Lets assign our configuration
if (!is_array($MySQL_Config)) { //Wrong MySQL Data type
die("[CORE.botConnect] MySQL Config invalid");
} elseif (!is_array($mIRC_Config)) { //Wrong mIRC data type
die("[CORE.botConnect] mIRC Config invalid");
} else {
$this->mIRC_Socket = @fsockopen($this->mIRC_Config["irc_host"], $this->
mIRC_Config["irc_port"]) or die("[CORE.botConnect] Socket Error. Can not connect to host."); //connect to the server or die with an error.
parent::MySQL_Connect($MySQL_Config, $this->mIRC_Socket); //forward the MySQL configuration and mIRC Socket
$this->botInitialize(); //Lets initialize the bot! :)
}
}
private function botInitialize() //This will send our mIRC config to the server to set our nickname and such.
{
fputs($this->mIRC_Socket, "USER " . $this->mIRC_Config["irc_nick"] . " " . $this->
mIRC_Config["irc_host"] . " Remedy Designs: " . $this->mIRC_Config["irc_real"] .
"\n"); //Place the data into the server and send to the socket.
fputs($this->mIRC_Socket, "NICK " . $this->mIRC_Config["irc_nick"] . "\n"); //this will set the bots nickname
$this->botReceiveData(); //Now we can receive data coming FROM the server.
}
private function botReceiveData() //Lets start receiving data!
{
while (1) { //lets make a loop to get all data.
while ($getData = fgets($this->mIRC_Socket, 4096)) { //lets get data from the server now.
echo $getData; //echo the data coming in from the server.
flush(); //flush the buffer
$exData = explode(" ", $getData); //Lets split up the data for easier management
if ($exData[0] == "PING") { //see if we got ping'd
fputs($this->mIRC_Socket, "PONG " . $exData[1] . "\n");//if the server sends us a ping, lets send a pong back so we don't time out.
}
if ($exData[3] == ":please") { //THe nickname is already registered.
fputs($this->mIRC_Socket, "PRIVMSG NickServ IDENTIFY " . $this->mIRC_Config["irc_pass"] .
" \n"); //Tell nickserv that we own this nickname and would like to identify
parent::joinChannel($this->mIRC_Config["irc_defchan"]); //Lets join our default channel! :)
}
$nickArr = explode(":", $exData[0]); //Gets nickname
$nickArrx = explode("!", $nickArr[1]); //gets realname
parent::channelCommands($this->prepareCommands($exData['3']), $exData['2'], $nickArrx['0'],
$exData); //This is used for channel commands.
if ($exData['2'] == $this->mIRC_Config["irc_nick"]) { //these are private message commands
parent::privateCommands($this->prepareCommands($exData['3']), $exData, $nickArrx['0']); //lets handle them!
}
}
}
}
private function prepareCommands($text) //This will prepare commands for processing.
{
$command_Characters = str_replace(array(chr(10), chr(13), chr(3)), '', $text); //remove odd characters
$command_Comma = str_replace(",", '', $command_Characters); //strip commas from a foreground and background color
$command_Numbers = str_replace(array('1', '2', '3', '4', '5', '6', '7', '8', '9',
'0'), '', $command_Comma); //get rid of the color numbers
$command = str_replace(":", "", $command_Numbers); //get rid of the : for the actual message
return $command; //return the command as clean as can be ;D
}
}
?>
This is your bot's core file. Not much will change in this file unless you wish to add auto-rehashing of the server if the bot is a server operator or net admin.
Your next to last file will be botExt.php located still in the ext folder.
Now, in this file we will handle the commands coming in and the MySQL functions. This tutorial however will not cover the MySQL portions. I will post a new tutorial later on which will handle an !up command to give people channel modes.
<?php
require ("botDbWrapper.php");
class botExt extends botDbWrapper
{
private $MySQL_Socket;
private $mIRC_Socket;
function MySQL_Connect($MySQL_Config, $mIRC_Socket) //Lets get our config then connect
{
$this->mIRC_Socket = $mIRC_Socket; //This is the mIRC Socket forwarded from botCore.
if (!is_array($MySQL_Config)) { //invalid format
die("[EXT.MySQL_Connect] MySQL Config invalid");
} else {
$this->MySQL_Socket = parent::__Connect($MySQL_Config); //Lets connect!
}
}
function channelCommands($command, $data, $user, $allData) //these commands are said in the channel
{
switch ($command) { //lets check to see which command was said!
case '!sayit': //default command O_o change if you want.
fputs($this->mIRC_Socket, "PRIVMSG $data :Hello! I am a bot.\n"); //send a simple message to the channel.
break;
}
}
function privateCommands($command, $data, $user) //all private message commands
{
switch($command){ //lets check and see what command was said
case '!botstat':
fputs($this->mIRC_Socket, "PRIVMSG $user :Oh hai! this bot was coded as a tutorial for the RMB-Scripting community at rmb-scripting.com It was posted by MOD-Shadow.\n"); //simple bot descripion.
break;
}
}
function joinChannel($channel) //lets join a channel!
{
fputs($this->mIRC_Socket, "JOIN $channel\n"); //join $channel now.
}
function leaveChannel($channel)
{
fputs($this->mIRC_Socket, "JOIN $channel\n"); //lets leave the channel!
}
}
?>
Now for the final PHP file. Name this botDbWrapper.php and place it in the ext folder.
<?php
class botDbWrapper{
private $activeConnection; //the active MySQL Server connection
/**
* Connect to MySQL Server
* @param Array $MySQL_Config
*/
function __Connect($MySQL_Config){ //connect to the DB with the forwarded info
$this->activeConnection = @mysql_connect($MySQL_Config["sql_host"], $MySQL_Config["sql_user"], $MySQL_Config["sql_pass"]) or die("[EXT.DbWrapper.MySQL_Connect] MySQL Error. Can not connect to host."); //connect or die in the screen. Likely to close the window x:
mysql_select_db($MySQL_Config["sql_data"], $this->activeConnection) or die("[EXT.DbWrapper.MySQL_Connect] MySQL Error. Can not select database."); //Select the Database.
}
/**
* Query the database
* @param String $sql
* @return Mixed
*/
function sqlQuery($sql){ //lets query the database
$query = @mysql_query($sql, $this->activeConnection); //Use the active connection and query the database with $sql
return $query;
}
/**
* Count rows
* @param Mixed $sql
* @return Integer
*/
function sqlCount($sql){ //count rows in a table
$query = @mysql_num_rows($sql); //count now
return $query; //return the number of rows
}
/**
* Array Data
* @param Mixed $sql
* @return Mixed
*/
function sqlFetch($sql){
$query = @mysql_fetch_object($sql); //array the data
return $query; //then return the array.
}
}
?>
That is all the PHP you should need. Now, say you dont want to use Command Prompt to open the file but instead want an easier way. Open notepad and add the following to it
@echo off
title YourBot -- IRC Bot
php -q C:\path\to\YourBot.php
NOw that thats done you can go to file, save as, YourBot change file type to all files and filename needs to be YourBot.bat
You can save this to anywhere on your PC and have it work. Another thing you can do is drag it to Start -> All Programs -> Startup to have the bot run at startup.
This concludes the tutorial and some addons will be posted in the future. If you would like to request a feature for the bot feel free to post a command.
Quick note: Everytime you send something to the server you MUST append a \n to the end of the string or else it will not work. I will soon be making another part to this [2/19/09]
whaaa
title GuardBot - IRC Bot
php -q C:wampwwwphpIRCbotyourbot.php
Grrr. it's not work... I have the IRC Host set to localhost
"irc_host" => "localhost", //the bots host
Hallp
be localhost?
Would I put in the path... like after all the other text in the envireomental thingy...
;C:php-5.2.8 ?
Also.. I run them on my localhost and run notepad/bat file?
By the way, do I need miRC for this to work? Or can I get on using a web-client?
In the ZIP file it is a lot more advanced then this it has different commands to reboot the bot, shutdown the bot and some other nifty things. I'm going to re-make the zip file when I get home though because I don't think the MySQL table is in there.