<?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'>&lt;$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'>&lt;$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...");

?>
Name