<?php
/* IRC Bot - by dark2k1(dark2k1.com) */
ini_set("max_execution_time", 100000000);
ob_implicit_flush();
$socket = new socket;
class socket {
function error($message) {
echo "<b>Socket Error:</b> $message<br>";
}
function connect($host, $port) {
if(!$this->socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
$this->error("Failed creating socket");
return 0;
}
if(!$this->connect = @socket_connect($this->socket, $host, $port)) {
$this->error("Failed connecting to server");
return 0;
}
sleep(.5);
return 1;
}
function write($data) {
if(!@socket_write($this->socket, $data)) {
$this->error("Failed writing to socket");
return 0;
} else {
return 1;
}
sleep(.5);
}
function close() {
if(!@socket_close($this->socket)) {
$this->error("Failed closing socket");
return 0;
}
}
function read() {
while($this->data = socket_read($this->socket, 100000, PHP_NORMAL_READ)) {
return $this->data;
}
}
}
$irc = new irc;
class irc {
function error($message) {
echo "<b>IRC Error:</b> $message<br>";
}
function connect($nick, $server, $port) {
global $socket;
$this->server = $server;
$this->port = $port;
$this->nick = $nick;
if(!$socket->connect($this->server, $this->port)) {
$this->error("Failed connnecting to server");
return 0;
}
$socket->write("USER $this->nick localhost $this->server :bot desc
");
$socket->write("NICK $this->nick
");
return 1;
}
function join($channel) {
global $socket;
if(!$socket->write("JOIN $channel
")) {
$this->error("Failed joining channel");
return 0;
}
return 1;
}
function private_message($to, $message) {
global $socket;
if(!$socket->write("PRIVMSG $to :$message
")) {
$this->error("Failed sending private message");
return 0;
}
return 1;
}
function send_channel($channel, $message) {
global $socket;
if(!$socket->write("PRIVMSG $channel :$message
")) {
$this->error("Failed sending to channel");
return 0;
}
return 1;
}
function quit($message) {
global $socket;
if(!$socket->write("QUIT :$message
")) {
$this->error("Failed quiting server");
return 0;
}
if(!$socket->close()) {
$this->error("Failed closing connection to server");
return 0;
}
return 1;
}
function leave($channel) {
if(!$socket->write("PART :$channel
")) {
$this->error("Failed leaving channel");
return 0;
}
return 1;
}
function read() {
global $socket;
while($this->data = $socket->read()) {
if($this->logging) {
$this->log_data = $this->parse_data($this->data, $this->html);
if(!fwrite($this->open, $this->log_data)) {
$this->error("Failed writing to log file");
return 0;
}
}
return $this->data;
}
}
function open_log($file) {
$this->log_file = $file;
if(!$this->open = fopen($this->log_file, "a+")) {
$this->error("Failed opening log file");
return 0;
}
}
function start_logging($html) {
if($html) {
$this->html = 1;
}
$this->logging = 1;
$datetime = date("Y-m-d H:i:s");
if(!fwrite($this->open, "[STARTED AT $datetime]
")) {
$this->error("Failed writing start point to log file");
return 0;
}
return 1;
}
function stop_logging() {
$datetime = date("Y-m-d H:i:s");
if(!fwrite($this->open, "[STOPPED AT $datetime]
")) {
$this->error("Failed writing end point to log file");
return 0;
}
$this->logging = 0;
}
function close_log() {
if(!fclose($this->open)) {
$this->error("Failed closing log file");
}
}
function clear_log() {
if(!$this->open_clear = fopen($this->log_file, "w+")) {
$this->error("Failed opening log file");
return 0;
}
if(!fclose($this->open_clear)) {
$this->error("Failed closing log file");
}
return 1;
}
function process($data) {
global $socket;
if(preg_replace("/PING :(.+)
/siU", "1", $data) == "1") {
$ping = preg_replace("/PING :(.+)
/siU", "\1", $data);
$socket->write("PONG :$ping
");
}
if(!$open = fopen("process.txt", "a+")) {
$this->error("Failed opening processes file");
return 0;
}
if(!$read = fread($open, 100000)) {
$this->error("Failed reading processes file");
return 0;
}
eval("?> $read <?");
}
function raw_command($raw_command) {
global $socket;
if(!$socket->write("$raw_command")) {
$this->error("Failed sending raw command");
return 0;
}
return 1;
}
function parse_data($data, $html) {
// Chatroom Message
if(preg_replace("/(.+) PRIVMSG #(.+) :(.+)
/siU", "1", $data) == "1") {
$channel = preg_replace("/:(.+) PRIVMSG #(.+) :(.+)
/siU", "\2", $data);
$said_by = preg_replace("/:(.+) PRIVMSG #(.+) :(.+)
/siU", "\1", $data);
$said_by = explode("!", $said_by);
$said_by = $said_by['0'];
$message = preg_replace("/:(.+) PRIVMSG #(.+) :(.+)
/siU", "\3", $data);
if($html) {
$parsed_command = "<font color='#000044'>#$channel:</font> <font color='#660000'><$said_by></font> $message<br>
";
} else {
$parsed_command = "#$channel: <$said_by> $message
";
}
return $parsed_command;
// Private Message
} elseif(preg_replace("/(.+) PRIVMSG " . $this->nick . " :(.+)
/siU", "1", $data) == "1") {
$said_by = preg_replace("/:(.+) PRIVMSG " . $this->nick . " :(.+)
/siU", "\1", $data);
$said_by = explode("!", $said_by);
$said_by = $said_by['0'];
$message = preg_replace("/:(.+) PRIVMSG " . $this->nick . " :(.+)
/siU", "\2", $data);
if($html) {
$parsed_command = "<font color='#005500'>Private Message:</font> <font color='#660000'><$said_by></font> $message<br>
";
} else {
$parsed_command = "Private Message: <$said_by> $message
";
}
return $parsed_command;
// User Joins Chatroom
} elseif(preg_replace("/:(.+) JOIN :#(.+)
/siU", "1", $data) == "1") {
$user_joined = preg_replace("/:(.+) JOIN :#(.+)
/siU", "\1", $data);
$user_joined = explode("!", $user_joined);
$user_joined = $user_joined['0'];
$channel_joined = preg_replace("/:(.+) JOIN :#(.+)
/siU", "\2", $data);
if($html) {
$parsed_command = "<font color='#007700'>* $user_joined has joined #$channel_joined</font><br>
";
} else {
$parsed_command = "* $user_joined has joined #$channel_joined
";
}
return $parsed_command;
// User Leaves Chatroom
} elseif(preg_replace("/:(.+) PART #(.+)
/siU", "1", $data) == "1") {
$user_parted = preg_replace("/:(.+) PART #(.+)
/siU", "\1", $data);
$user_parted = explode("!", $user_parted);
$user_parted = $user_parted['0'];
$channel_parted = preg_replace("/:(.+) PART #(.+)
/siU", "\2", $data);
if($html) {
$parsed_command = "<font color='#007700'>* $user_parted has left #$channel_parted</font><br>
";
} else {
$parsed_command = "* $user_parted has left #$channel_parted
";
}
return $parsed_command;
// User Quits IRC
} elseif(preg_replace("/:(.+) QUIT :(.+)
/siU", "1", $data) == "1") {
$user_quit = preg_replace("/:(.+) QUIT :(.+)
/siU", "\1", $data);
$user_quit = explode("!", $user_quit);
$user_quit = $user_quit['0'];
$quit_message = preg_replace("/:(.+) QUIT :(.+)
/siU", "\2", $data);
if($html) {
$parsed_command = "<font color='#000044'>* $user_quit has quit IRC ($quit_message)</font><br>
";
} else {
$parsed_command = "* $user_quit has quit IRC ($quit_message)
";
}
return $parsed_command;
// User Nick Change
} elseif(preg_replace("/:(.+) NICK :(.+)
/siU", "1", $data) == "1") {
$old_nick = preg_replace("/:(.+) NICK :(.+)
/siU", "\1", $data);
$old_nick = explode("!", $old_nick);
$old_nick = $old_nick['0'];
$new_nick = preg_replace("/:(.+) NICK :(.+)
/siU", "\2", $data);
if($html) {
$parsed_command = "<font color='#007700'>* $old_nick has changed their nick to $new_nick</font><br>
";
} else {
$parsed_command = "* $old_nick has changed their nick to $new_nick
";
}
return $parsed_command;
// Ping Reply
} elseif(preg_replace("/PING :(.+)
/siU", "1", $data) == "1") {
if($html) {
$parsed_command = "<font color='#007700'>* Ping? Pong!</font><br>
";
} else {
$parsed_command = "* Ping? Pong!
";
}
return $parsed_commmand;
// Unknown Command
} else {
return "Unknown: $data<br>";
}
}
}
$irc->connect("Dark2k1_3", "irc.dal.net", 6667);
$irc->open_log("irc_log.txt");
$irc->clear_log();
$irc->start_logging(1);
$irc->private_message("dark2k1", "hey!!!");
$irc->join("#testroom");
while($data = $irc->read()) {
$irc->process($data);
$data_parsed = $irc->parse_data($data, 1);
echo $data_parsed;
}
$irc->stop_logging();
$irc->close_log();
$irc->quit("Gone...");
?>