Gazelle/classes/irc.class.php

184 lines
4.9 KiB
PHP
Raw Normal View History

2011-03-28 14:21:28 +00:00
<?
class IRC_DB extends DB_MYSQL {
function halt($Msg) {
global $Bot;
2014-02-19 08:00:32 +00:00
$Bot->send_to($Bot->get_channel(), 'The database is currently unavailable; try again later.');
2011-03-28 14:21:28 +00:00
}
}
abstract class IRC_BOT {
abstract protected function connect_events();
abstract protected function channel_events();
2012-10-11 08:00:15 +00:00
abstract protected function query_events();
2015-04-19 08:00:26 +00:00
abstract protected function irc_events();
2011-03-28 14:21:28 +00:00
abstract protected function listener_events();
protected $Debug = false;
protected $Socket = false;
protected $Data = false;
protected $Whois = false;
protected $Identified = array();
protected $Channels = array();
protected $Messages = array();
protected $LastChan = false;
2014-02-19 08:00:32 +00:00
protected $ListenSocket = false;
2011-03-28 14:21:28 +00:00
protected $Listened = false;
2012-10-05 08:00:20 +00:00
protected $Connecting = false;
2014-02-19 08:00:32 +00:00
protected $State = 1; // Drone is live
public $Restart = 0; // Die by default
2011-03-28 14:21:28 +00:00
public function __construct() {
2013-08-13 08:00:43 +00:00
if (isset($_SERVER['HOME']) && is_dir($_SERVER['HOME']) && getcwd() != $_SERVER['HOME']) {
chdir($_SERVER['HOME']);
}
2015-04-19 08:00:26 +00:00
ob_end_clean();
2011-03-28 14:21:28 +00:00
restore_error_handler(); //Avoid PHP error logging
set_time_limit(0);
}
public function connect() {
2012-10-05 08:00:20 +00:00
$this->connect_irc();
$this->connect_listener();
$this->post_connect();
}
2015-04-19 08:00:26 +00:00
private function connect_irc($Reconnect = false) {
2012-10-05 08:00:20 +00:00
$this->Connecting = true;
2011-03-28 14:21:28 +00:00
//Open a socket to the IRC server
2015-04-19 08:00:26 +00:00
if (defined('BOT_PORT_SSL')) {
$IrcAddress = 'tls://' . BOT_SERVER . ':' . BOT_PORT_SSL;
} else {
$IrcAddress = 'tcp://' . BOT_SERVER . ':' . BOT_PORT;
}
while (!$this->Socket = stream_socket_client($IrcAddress, $ErrNr, $ErrStr)) {
2012-10-05 08:00:20 +00:00
sleep(15);
}
2011-03-28 14:21:28 +00:00
stream_set_blocking($this->Socket, 0);
2012-10-05 08:00:20 +00:00
$this->Connecting = false;
if ($Reconnect) {
$this->post_connect();
}
}
2011-03-28 14:21:28 +00:00
2015-04-19 08:00:26 +00:00
private function connect_listener() {
2011-03-28 14:21:28 +00:00
//create a socket to listen on
2015-04-19 08:00:26 +00:00
$ListenAddress = 'tcp://' . SOCKET_LISTEN_ADDRESS . ':' . SOCKET_LISTEN_PORT;
if (!$this->ListenSocket = stream_socket_server($ListenAddress, $ErrNr, $ErrStr)) {
die("Cannot create listen socket: $ErrStr");
}
stream_set_blocking($this->ListenSocket, false);
2012-10-05 08:00:20 +00:00
}
2011-03-28 14:21:28 +00:00
2015-04-19 08:00:26 +00:00
private function post_connect() {
2011-03-28 14:21:28 +00:00
fwrite($this->Socket, "NICK ".BOT_NICK."Init\n");
fwrite($this->Socket, "USER ".BOT_NICK." * * :IRC Bot\n");
$this->listen();
}
2013-04-19 08:00:55 +00:00
public function disconnect() {
2015-04-19 08:00:26 +00:00
fclose($this->ListenSocket);
2011-03-28 14:21:28 +00:00
$this->State = 0; //Drones dead
}
public function get_channel() {
preg_match('/.+ PRIVMSG ([^:]+) :.+/', $this->Data, $Channel);
2013-06-18 08:00:48 +00:00
if (preg_match('/#.+/', $Channel[1])) {
2011-03-28 14:21:28 +00:00
return $Channel[1];
} else {
return false;
}
}
public function get_nick() {
preg_match('/:([^!:]+)!.+@[^\s]+ PRIVMSG [^:]+ :.+/', $this->Data, $Nick);
return $Nick[1];
}
protected function get_message() {
preg_match('/:.+ PRIVMSG [^:]+ :(.+)/', $this->Data, $Msg);
return trim($Msg[1]);
}
2012-10-11 08:00:15 +00:00
protected function get_irc_host() {
2011-03-28 14:21:28 +00:00
preg_match('/:[^!:]+!.+@([^\s]+) PRIVMSG [^:]+ :.+/', $this->Data, $Host);
return trim($Host[1]);
}
2013-07-17 08:00:52 +00:00
protected function get_word($Select = 1) {
2011-03-28 14:21:28 +00:00
preg_match('/:.+ PRIVMSG [^:]+ :(.+)/', $this->Data, $Word);
2013-06-18 08:00:48 +00:00
$Word = split(' ', $Word[1]);
2011-03-28 14:21:28 +00:00
return trim($Word[$Select]);
}
protected function get_action() {
preg_match('/:.+ PRIVMSG [^:]+ :!(\S+)/', $this->Data, $Action);
return strtoupper($Action[1]);
}
protected function send_raw($Text) {
2012-10-05 08:00:20 +00:00
if (!feof($this->Socket)) {
2013-07-17 08:00:52 +00:00
fwrite($this->Socket, "$Text\n");
2012-10-05 08:00:20 +00:00
} elseif (!$this->Connecting) {
$this->Connecting = true;
sleep(120);
$this->connect_irc(true);
}
2011-03-28 14:21:28 +00:00
}
public function send_to($Channel, $Text) {
2013-10-14 08:00:53 +00:00
// split the message up into <= 460 character strings and send each individually
// this is used to prevent messages from getting truncated
$Text = wordwrap($Text, 460, "\n", true);
$TextArray = explode("\n", $Text);
foreach ($TextArray as $Text) {
$this->send_raw("PRIVMSG $Channel :$Text");
}
2011-03-28 14:21:28 +00:00
}
protected function whois($Nick) {
$this->Whois = $Nick;
$this->send_raw("WHOIS $Nick");
}
2012-10-11 08:00:15 +00:00
2011-03-28 14:21:28 +00:00
/*
2012-10-11 08:00:15 +00:00
This function uses blacklisted_ip, which is no longer in RC2.
You can probably find it in old RC1 code kicking aronud if you need it.
2013-06-18 08:00:48 +00:00
protected function ip_check($IP, $Gline = false, $Channel = BOT_REPORT_CHAN) {
2013-04-20 08:01:01 +00:00
if (blacklisted_ip($IP)) {
2011-03-28 14:21:28 +00:00
$this->send_to($Channel, 'TOR IP Detected: '.$IP);
if ($Gline) {
$this->send_raw('GLINE *@'.$IP.' 90d :DNSBL Proxy');
}
}
2013-04-20 08:01:01 +00:00
if (Tools::site_ban_ip($IP)) {
2013-02-07 08:00:47 +00:00
$this->send_to($Channel, 'Site IP Ban Detected: '.$IP);
if ($Gline) {
$this->send_raw('GLINE *@'.$IP.' 90d :IP Ban');
2011-03-28 14:21:28 +00:00
}
}
}*/
protected function listen() {
2013-08-28 23:08:41 +00:00
G::$Cache->InternalCache = false;
2011-03-28 14:21:28 +00:00
stream_set_timeout($this->Socket, 10000000000);
2013-04-20 08:01:01 +00:00
while ($this->State == 1) {
2015-04-19 08:00:26 +00:00
$NullSock = null;
$Sockets = array($this->Socket, $this->ListenSocket);
if (stream_select($Sockets, $NullSock, $NullSock, null) === false) {
die();
2011-03-28 14:21:28 +00:00
}
2015-04-19 08:00:26 +00:00
foreach ($Sockets as $Socket) {
if ($Socket === $this->Socket) {
$this->irc_events();
} else {
$this->Listened = stream_socket_accept($Socket);
$this->listener_events();
}
2011-03-28 14:21:28 +00:00
}
2013-08-28 23:08:41 +00:00
G::$DB->LinkID = false;
G::$DB->Queries = array();
2011-03-28 14:21:28 +00:00
}
}
}
?>