X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FMsn%2Fmsnmanager.php;h=82d40d69c92e80eff7d5e42d51b76b159d75ba82;hb=b6cfcfbcaa0459b39c5d581c103bfa031b2e02cd;hp=8322cde32d2f280fecd1ec9c7c77fc11e7079df0;hpb=6dbf0ab1fe355032bfa4c3858b6b75079a2d5dcf;p=quix0rs-gnu-social.git diff --git a/plugins/Msn/msnmanager.php b/plugins/Msn/msnmanager.php index 8322cde32d..82d40d69c9 100644 --- a/plugins/Msn/msnmanager.php +++ b/plugins/Msn/msnmanager.php @@ -29,11 +29,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } * In a multi-site queuedaemon.php run, one connection will be instantiated * for each site being handled by the current process that has MSN enabled. */ - class MsnManager extends ImManager { public $conn = null; - private $lastping = null; - private $pingInterval; + protected $lastPing = null; + protected $pingInterval; /** * Initialise connection to server. @@ -42,6 +41,7 @@ class MsnManager extends ImManager { */ public function start($master) { if (parent::start($master)) { + $this->requeue_waiting_messages(); $this->connect(); return true; } else { @@ -71,11 +71,19 @@ class MsnManager extends ImManager { * @return void */ public function idle($timeout = 0) { - if (empty($this->lastping) || time() - $this->lastping > $this->pingInterval) { + if (empty($this->lastPing) || time() - $this->lastPing > $this->pingInterval) { $this->send_ping(); } } + /** + * Message pump is triggered on socket input, so we only need an idle() + * call often enough to trigger our outgoing pings. + */ + public function timeout() { + return $this->pingInterval; + } + /** * Process MSN events that have come in over the wire. * @@ -100,16 +108,18 @@ class MsnManager extends ImManager { 'user' => $this->plugin->user, 'password' => $this->plugin->password, 'alias' => $this->plugin->nickname, - 'psm' => 'Send me a message to post a notice', - 'debug' => true + // TRANS: MSN bot status message. + 'psm' => _m('Send me a message to post a notice'), + 'debug' => false ) ); - $this->conn->registerHandler("IMIn", array($this, 'handle_msn_message')); + $this->conn->registerHandler('IMin', array($this, 'handle_msn_message')); + $this->conn->registerHandler('SessionReady', array($this, 'handle_session_ready')); $this->conn->registerHandler('Pong', array($this, 'update_ping_time')); $this->conn->registerHandler('ConnectFailed', array($this, 'handle_connect_failed')); $this->conn->registerHandler('Reconnect', array($this, 'handle_reconnect')); $this->conn->signon(); - $this->lastping = time(); + $this->lastPing = time(); } return $this->conn; } @@ -120,26 +130,26 @@ class MsnManager extends ImManager { * * @return void */ - private function send_ping() { + protected function send_ping() { $this->connect(); if (!$this->conn) { return false; } $this->conn->sendPing(); - $this->lastping = time(); + $this->lastPing = time(); $this->pingInterval = 50; return true; } /** * Update the time till the next ping - * + * * @param $data Time till next ping * @return void */ - private function update_ping_time($data) { - $pingInterval = $data; + public function update_ping_time($data) { + $this->pingInterval = $data; } /** @@ -148,21 +158,57 @@ class MsnManager extends ImManager { * Passes it back to the queuing system * * @param array $data Data - * @return void + * @return boolean */ - private function handle_msn_message($data) { - $this->plugin->enqueue_incoming_raw($data); + public function handle_msn_message($data) { + $this->plugin->enqueueIncomingRaw($data); return true; } + /** + * Called via a callback when a session becomes ready + * + * @param array $data Data + */ + public function handle_session_ready($data) { + $sessionFailed = false; + $wm = Msn_waiting_message::top($data['to']); + while ($wm != NULL) { + if ($sessionFailed) { + $this->plugin->sendMessage($wm->screenname, $wm->message); + $sessionFailed = true; + } elseif (!$this->conn->sendMessage($wm->screenname, $wm->message, $ignore)) { + $this->plugin->sendMessage($wm->screenname, $wm->message); + } + + $wm->delete(); + $wm = Msn_waiting_message::top($data['to']); + } + } + + /** + * Requeue messages from the waiting table so we try + * to send them again + * + * @return void + */ + protected function requeue_waiting_messages() { + $wm = Msn_waiting_message::top(); + while ($wm != NULL) { + $this->plugin->sendMessage($wm->screenname, $wm->message); + $wm->delete(); + $wm = Msn_waiting_message::top(); + } + } + /** * Called by callback to log failure during connect * - * @param void $data Not used (there to keep callback happy) + * @param string $message error message reported * @return void */ - private function handle_connect_failed($data) { - common_log(LOG_NOTICE, 'MSN connect failed, retrying'); + public function handle_connect_failed($message) { + common_log(LOG_NOTICE, 'MSN connect failed, retrying: ' . $message); } /** @@ -171,23 +217,40 @@ class MsnManager extends ImManager { * @param void $data Not used (there to keep callback happy) * @return void */ - private function handle_reconnect($data) { + public function handle_reconnect($data) { common_log(LOG_NOTICE, 'MSN reconnecting'); + // Requeue messages waiting in the DB + $this->requeue_waiting_messages(); } - + /** - * Called by callback when contact changes status - * - * @param array $data Data - */ - private function handle_status_change($data) { - + * Enters a message into the database for sending via a callback + * when the session is established + * + * @param string $to Intended recipient + * @param string $message Message + */ + protected function enqueue_waiting_message($to, $message) { + $wm = new Msn_waiting_message(); + + $wm->screenname = $to; + $wm->message = $message; + $wm->created = common_sql_now(); + $result = $wm->insert(); + + if (!$result) { + common_log_db_error($wm, 'INSERT', __FILE__); + // TRANS: Server exception thrown when a message to be sent through MSN cannot be added to the database queue. + throw new ServerException(_m('Database error inserting queue item.')); + } + + return true; } /** * Send a message using the daemon - * - * @param $data Message + * + * @param $data Message data * @return boolean true on success */ public function send_raw_message($data) { @@ -196,12 +259,17 @@ class MsnManager extends ImManager { return false; } - if (!$this->conn->sendMessage($data['to'], $data['message'])) { - return false; + $waitForSession = false; + if (!$this->conn->sendMessage($data['to'], $data['message'], $waitForSession)) { + if ($waitForSession) { + $this->enqueue_waiting_message($data['to'], $data['message']); + } else { + return false; + } } // Sending a command updates the time till next ping - $this->lastping = time(); + $this->lastPing = time(); $this->pingInterval = 50; return true; }