diff options
author | Evan Prodromou <evan@prodromou.name> | 2008-06-22 22:27:10 -0400 |
---|---|---|
committer | Evan Prodromou <evan@prodromou.name> | 2008-06-22 22:27:10 -0400 |
commit | 7d9372ec502ef681637eb48dac7a4444c9a86640 (patch) | |
tree | 8272022b364fe4f3ea320732e903aaa0d8d471e8 | |
parent | 1899d09cd11676d375814e6c80107d93748656a7 (diff) |
first pass at a daemon to receive XMPP messages
darcs-hash:20080623022710-84dde-bf3d3e3ce87957b9a91d38c16cf834d07b9933ea.gz
-rw-r--r-- | config.php.sample | 9 | ||||
-rw-r--r-- | lib/common.php | 9 | ||||
-rw-r--r-- | xmppdaemon.php | 142 |
3 files changed, 159 insertions, 1 deletions
diff --git a/config.php.sample b/config.php.sample index 8253bdeed..82c1c44ea 100644 --- a/config.php.sample +++ b/config.php.sample @@ -36,3 +36,12 @@ $config['db']['database'] = 'mysql://laconica:microblog@localhost/laconica'; #Standard fancy-url clashes prevented by not allowing nicknames on a blacklist #Add your own here. Note: empty array by default #$config['nickname']['blacklist'][] = 'scobleizer'; + +# xmpp +#$config['xmpp']['enabled'] = false; +#$config['xmpp']['server'] = 'server.example.net'; +#$config['xmpp']['port'] = 5222; +#$config['xmpp']['user'] = 'update'; +#$config['xmpp']['resource'] = 'uniquename'; +#$config['xmpp']['password'] = 'blahblahblah'; + diff --git a/lib/common.php b/lib/common.php index 2853c56e3..d2e7e2ed5 100644 --- a/lib/common.php +++ b/lib/common.php @@ -56,7 +56,14 @@ $config = array('backend' => 'mail', 'params' => NULL), 'nickname' => - array('blacklist' => array()) + array('blacklist' => array()), + 'xmpp' => + array('enabled' => false, + 'server' => 'INVALID SERVER', + 'port' => 5222, + 'user' => 'update', + 'resource' => 'uniquename', + 'password' => 'blahblahblah'), ); $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options'); diff --git a/xmppdaemon.php b/xmppdaemon.php new file mode 100644 index 000000000..43c49e604 --- /dev/null +++ b/xmppdaemon.php @@ -0,0 +1,142 @@ +<?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2008, Controlez-Vous, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +define('INSTALLDIR', dirname(__FILE__)); +define('LACONICA', true); + +require_once(INSTALLDIR . '/lib/common.php'); +require_once('xmpp.php'); + +class XMPPDaemon { + + function XMPPDaemon() { + foreach (array('server', 'port', 'user', 'password', 'resource') as $attr) { + $this->$attr = common_config('xmpp', $attr); + } + } + + function connect() { + $this->conn = new XMPP($this->host, $this->port, $this->user, + $this->password, $this->resource); + if (!$this->conn) { + return false; + } + $this->conn->connect(); + return !$this->conn->disconnected; + } + + function handle() { + while(!$this->conn->disconnected) { + $payloads = $this->conn->processUntil(array('message', 'presence', + 'end_stream', 'session_start')); + foreach($payloads as $event) { + $pl = $event[1]; + switch($event[0]) { + case 'message': + $this->handle_message($pl); + break; + case 'presence': + $this->handle_presence($pl); + break; + case 'session_start': + $this->handle_session($pl); + break; + } + } + } + } + + function handle_message(&$pl) { + $user = User::staticGet('jabber', $pl['from']); + if (!$user) { + $this->log(LOG_WARNING, 'Message from unknown user ' . $pl['from']); + return; + } + if ($this->handle_command($user, $pl['body'])) { + return; + } else { + $this->add_notice($user, $pl); + } + } + + function handle_command($user, $body) { + # XXX: localise + switch(trim($body)) { + case 'on': + $this->set_notify($user, true); + return true; + case 'off': + $this->set_notify($user, false); + return true; + default: + return false; + } + } + + function add_notice(&$user, &$pl) { + $notice = new Notice(); + $notice->profile_id = $user->id; + $notice->content = trim(substr($pl['body'], 0, 140)); + $notice->created = DB_DataObject_Cast::dateTime(); + $notice->query('BEGIN'); + $id = $notice->insert(); + if (!$id) { + $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); + $this->log(LOG_ERROR, + 'Could not insert ' . common_log_objstring($notice) . + ' for user ' . common_log_objstring($user) . + ': ' . $last_error->message); + return; + } + $orig = clone($notice); + $notice->uri = common_notice_uri($notice); + $result = $notice->update($orig); + if (!$result) { + $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); + $this->log(LOG_ERROR, + 'Could not add URI to ' . common_log_objstring($notice) . + ' for user ' . common_log_objstring($user) . + ': ' . $last_error->message); + return; + } + common_broadcast_notice($notice); + } + + function handle_presence(&$pl) { + $user = User::staticGet('jabber', $pl['from']); + if (!$user) { + $this->log(LOG_WARNING, 'Message from unknown user ' . $pl['from']); + return; + } + if ($user->updatefrompresence) { + $this->add_notice($user, $pl); + } + } + + function handle_session(&$pl) { + $conn->presence($status="Send me a message to post a notice"); + } + + function log($level, $msg) { + common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg); + } +} + + +?> |