X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FIrc%2Fircmanager.php;h=b99c7b2fea3aa81a9647d4ea06b38b2c873bc624;hb=067633a608a7567168cadf96e1bd1d5907931430;hp=c885064916c4532d65e7d2972876e3c6c5bbd4e8;hpb=af5ecb88b153c44ab5dbb263edf58a8914a6ca17;p=quix0rs-gnu-social.git diff --git a/plugins/Irc/ircmanager.php b/plugins/Irc/ircmanager.php index c885064916..b99c7b2fea 100644 --- a/plugins/Irc/ircmanager.php +++ b/plugins/Irc/ircmanager.php @@ -23,15 +23,16 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } * IRC background connection manager for IRC-using queue handlers, * allowing them to send outgoing messages on the right connection. * - * Input is handled during socket select loop, keepalive pings during idle. - * Any incoming messages will be handled. + * Input is handled during socket select loop, Any incoming messages will be handled. * * In a multi-site queuedaemon.php run, one connection will be instantiated * for each site being handled by the current process that has IRC enabled. */ class IrcManager extends ImManager { - public $conn = null; + protected $conn = null; + protected $regchecks = array(); + protected $regchecksLookup = array(); /** * Initialize connection to server. @@ -65,13 +66,18 @@ class IrcManager extends ImManager { /** * Process IRC events that have come in over the wire. * - * @param resource $socket + * @param resource $socket Socket to handle input on * @return void */ public function handleInput($socket) { common_log(LOG_DEBUG, 'Servicing the IRC queue.'); $this->stats('irc_process'); - $this->conn->receive(); + + try { + $this->conn->handleEvents(); + } catch (Phergie_Driver_Exception $e) { + $this->conn->reconnect(); + } } /** @@ -81,14 +87,7 @@ class IrcManager extends ImManager { */ public function connect() { if (!$this->conn) { - $this->conn = new Phergie_ExtendedBot; - - $port = empty($this->plugin->port) ? 6667 : $this->plugin->port; - $password = empty($this->plugin->password) ? '' : $this->plugin->password; - $transport = empty($this->plugin->transporttype) ? 'tcp' : $this->plugin->transporttype; - $encoding = empty($this->plugin->encoding) ? 'UTF-8' : $this->plugin->encoding; - $nickservpassword = empty($this->plugin->nickservpassword) ? '' : $this->plugin->nickservpassword; - $channels = empty($this->plugin->channels) ? array() : $this->plugin->channels; + $this->conn = new Phergie_StatusnetBot; $config = new Phergie_Config; $config->readArray( @@ -96,34 +95,41 @@ class IrcManager extends ImManager { 'connections' => array( array( 'host' => $this->plugin->host, - 'port' => $port, + 'port' => $this->plugin->port, 'username' => $this->plugin->username, 'realname' => $this->plugin->realname, 'nick' => $this->plugin->nick, - 'password' => $password, - 'transport' => $transport, - 'encoding' => $encoding + 'password' => $this->plugin->password, + 'transport' => $this->plugin->transporttype, + 'encoding' => $this->plugin->encoding ) ), 'driver' => 'statusnet', - 'processor' => 'statusnet', + 'processor' => 'async', + 'processor.options' => array('sec' => 0, 'usec' => 0), 'plugins' => array( 'Pong', 'NickServ', 'AutoJoin', - 'Statusnet_Callback', + 'Statusnet', ), 'plugins.autoload' => true, 'ui.enabled' => true, - 'nickserv.password' => $nickservpassword, - 'autojoin.channels' => $channels, - 'statusnet_callback.callback' => array($this, 'handle_irc_message') + 'nickserv.password' => $this->plugin->nickservpassword, + 'nickserv.identify_message' => $this->plugin->nickservidentifyregexp, + + 'autojoin.channels' => $this->plugin->channels, + + 'statusnet.messagecallback' => array($this, 'handle_irc_message'), + 'statusnet.regcallback' => array($this, 'handle_reg_response'), + 'statusnet.unregregexp' => $this->plugin->unregregexp, + 'statusnet.regregexp' => $this->plugin->regregexp ) ); @@ -135,7 +141,6 @@ class IrcManager extends ImManager { /** * Called via a callback when a message is received - * * Passes it back to the queuing system * * @param array $data Data @@ -146,10 +151,55 @@ class IrcManager extends ImManager { return true; } + /** + * Called via a callback when NickServ responds to + * the bots query asking if a nick is registered + * + * @param array $data Data + * @return void + */ + public function handle_reg_response($data) { + // Retrieve data + $screenname = $data['screenname']; + $nickdata = $this->regchecks[$screenname]; + $usernick = $nickdata['user']->nickname; + + if (isset($this->regchecksLookup[$usernick])) { + if ($data['registered']) { + // Send message + $this->plugin->send_confirmation_code($screenname, $nickdata['code'], $nickdata['user'], true); + } else { + $this->plugin->send_message($screenname, _m('Your nickname is not registered so IRC connectivity cannot be enabled')); + + $confirm = new Confirm_address(); + + $confirm->user_id = $user->id; + $confirm->address_type = $this->plugin->transport; + + if ($confirm->find(true)) { + $result = $confirm->delete(); + + if (!$result) { + common_log_db_error($confirm, 'DELETE', __FILE__); + // TRANS: Server error thrown on database error canceling IM address confirmation. + $this->serverError(_('Couldn\'t delete confirmation.')); + return; + } + } + } + + // Unset lookup value + unset($this->regchecksLookup[$usernick]); + + // Unset data + unset($this->regchecks[$screename]); + } + } + /** * Send a message using the daemon * - * @param $data Message + * @param $data Message data * @return boolean true on success */ public function send_raw_message($data) { @@ -157,7 +207,29 @@ class IrcManager extends ImManager { if (!$this->conn) { return false; } - $this->conn->send($data[0], $data[1]); + + if ($data['type'] != 'message') { + // Nick checking + $nickdata = $data['nickdata']; + $usernick = $nickdata['user']->nickname; + $screenname = $nickdata['screenname']; + + // Cancel any existing checks for this user + if (isset($this->regchecksLookup[$usernick])) { + unset($this->regchecks[$this->regchecksLookup[$usernick]]); + } + + $this->regchecks[$screenname] = $nickdata; + $this->regchecksLookup[$usernick] = $screenname; + } + + try { + $this->conn->send($data['data']['command'], $data['data']['args']); + } catch (Phergie_Driver_Exception $e) { + $this->conn->reconnect(); + return false; + } + return true; } }