3 * StatusNet - the distributed open-source microblogging tool
\r
4 * Copyright (C) 2008, 2009, StatusNet, Inc.
\r
6 * This program is free software: you can redistribute it and/or modify
\r
7 * it under the terms of the GNU Affero General Public License as published by
\r
8 * the Free Software Foundation, either version 3 of the License, or
\r
9 * (at your option) any later version.
\r
11 * This program is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU Affero General Public License for more details.
\r
16 * You should have received a copy of the GNU Affero General Public License
\r
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
20 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
\r
23 * MSN background connection manager for MSN-using queue handlers,
\r
24 * allowing them to send outgoing messages on the right connection.
\r
26 * Input is handled during socket select loop, keepalive pings during idle.
\r
27 * Any incoming messages will be handled.
\r
29 * In a multi-site queuedaemon.php run, one connection will be instantiated
\r
30 * for each site being handled by the current process that has MSN enabled.
\r
33 class MsnManager extends ImManager {
\r
34 public $conn = null;
\r
35 private $lastping = null;
\r
36 private $pingInterval;
\r
39 * Initialise connection to server.
\r
41 * @return boolean true on success
\r
43 public function start($master) {
\r
44 if (parent::start($master)) {
\r
53 * Return any open sockets that the run loop should listen
\r
56 * @return array Array of socket resources
\r
58 public function getSockets() {
\r
61 return $this->conn->getSockets();
\r
68 * Idle processing for io manager's execution loop.
\r
69 * Send keepalive pings to server.
\r
73 public function idle($timeout = 0) {
\r
74 if (empty($this->lastping) || time() - $this->lastping > $this->pingInterval) {
\r
80 * Process MSN events that have come in over the wire.
\r
82 * @param resource $socket Socket ready
\r
85 public function handleInput($socket) {
\r
86 common_log(LOG_DEBUG, 'Servicing the MSN queue.');
\r
87 $this->stats('msn_process');
\r
88 $this->conn->receive();
\r
92 * Initiate connection
\r
96 function connect() {
\r
98 $this->conn = new MSN(
\r
100 'user' => $this->plugin->user,
\r
101 'password' => $this->plugin->password,
\r
102 'alias' => $this->plugin->nickname,
\r
103 'psm' => 'Send me a message to post a notice',
\r
107 $this->conn->registerHandler("IMIn", array($this, 'handle_msn_message'));
\r
108 $this->conn->registerHandler('Pong', array($this, 'update_ping_time'));
\r
109 $this->conn->registerHandler('ConnectFailed', array($this, 'handle_connect_failed'));
\r
110 $this->conn->registerHandler('Reconnect', array($this, 'handle_reconnect'));
\r
111 $this->conn->signon();
\r
112 $this->lastping = time();
\r
114 return $this->conn;
\r
118 * Called by the idle process to send a ping
\r
123 private function send_ping() {
\r
125 if (!$this->conn) {
\r
129 $this->conn->sendPing();
\r
130 $this->lastping = time();
\r
131 $this->pingInterval = 50;
\r
136 * Update the time till the next ping
\r
137 * @param $data Time till next ping
\r
139 private function update_ping_time($data) {
\r
140 $pingInterval = $data;
\r
144 * Called via a callback when a message is received
\r
146 * Passes it back to the queuing system
\r
148 * @param array $data Data
\r
151 private function handle_msn_message($data) {
\r
152 $this->plugin->enqueue_incoming_raw($data);
\r
157 * Called by callback to log failure during connect
\r
159 * @param void $data Not used (there to keep callback happy)
\r
162 function handle_connect_failed($data) {
\r
163 common_log(LOG_NOTICE, 'MSN connect failed, retrying');
\r
167 * Called by callback to log reconnection
\r
169 * @param void $data Not used (there to keep callback happy)
\r
172 function handle_reconnect($data) {
\r
173 common_log(LOG_NOTICE, 'MSN reconnecting');
\r
176 function send_raw_message($data) {
\r
178 if (!$this->conn) {
\r
182 if (!$this->conn->sendMessage($data['to'], $data['message'])) {
\r
186 // Sending a command updates the time till next ping
\r
187 $this->lastping = time();
\r
188 $this->pingInterval = 50;
\r