+#!/usr/bin/env php
<?php
/*
* Laconica - a distributed open-source microblogging tool
require_once(INSTALLDIR . '/lib/common.php');
require_once(INSTALLDIR . '/lib/jabber.php');
+# This is kind of clunky; we create a class to call the global functions
+# in jabber.php, which create a new XMPP class. A more elegant (?) solution
+# might be to use make this a subclass of XMPP.
+
class XMPPDaemon {
function XMPPDaemon($resource=NULL) {
- static $attrs = array('server', 'port', 'user', 'password',
- 'resource', 'host');
+ static $attrs = array('server', 'port', 'user', 'password', 'host');
foreach ($attrs as $attr)
{
if ($resource) {
$this->resource = $resource;
+ } else {
+ $this->resource = common_config('xmpp', 'resource') . 'daemon';
}
+
+ $this->log(LOG_INFO, "{$this->user}@{$this->server}/{$this->resource}");
}
function connect() {
- $this->conn = jabber_connect($this->resource,
- "Send me a message to post a notice");
- );
+ $connect_to = ($this->host) ? $this->host : $this->server;
+
+ $this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
+
+ $this->conn = jabber_connect($this->resource);
+
if (!$this->conn) {
return false;
}
'end_stream', 'session_start'));
foreach($payloads as $event) {
$pl = $event[1];
+ $this->log(LOG_DEBUG, "Received '$event[0]': " . print_r($pl, TRUE));
switch($event[0]) {
case 'message':
$this->handle_message($pl);
}
}
+ function get_user($from) {
+ $user = User::staticGet('jabber', jabber_normalize_jid($from));
+ return $user;
+ }
+
+ function get_confirmation($from) {
+ $confirm = new Confirm_address();
+ $confirm->address = $from;
+ $confirm->address_type = 'jabber';
+ if ($confirm->find(TRUE)) {
+ return $confirm;
+ } else {
+ return NULL;
+ }
+ }
+
function handle_message(&$pl) {
if ($pl['type'] != 'chat') {
return;
if (strlen($pl['body']) == 0) {
return;
}
+
$from = jabber_normalize_jid($pl['from']);
- $user = User::staticGet('jabber', $from);
+ $user = $this->get_user($from);
+
if (!$user) {
$this->log(LOG_WARNING, 'Message from unknown user ' . $from);
return;
case 'subscribe':
# We let anyone subscribe
$this->subscribed($from);
+ $this->log(LOG_INFO,
+ 'Accepted subscription from ' . $from);
break;
case 'subscribed':
- case 'unsubscribe':
case 'unsubscribed':
- # XXX: do we care?
+ case 'unsubscribe':
+ $this->log(LOG_INFO,
+ 'Ignoring "' . $pl['type'] . '" from ' . $from);
break;
default:
if (!$pl['type']) {
return;
}
if ($user->updatefrompresence) {
+ $this->log(LOG_INFO, 'Updating ' . $user->nickname .
+ ' status from presence.');
$this->add_notice($user, $pl);
}
}
}
function subscribed($to) {
- $this->special_presence('subscribed', $to);
+ jabber_special_presence('subscribed', $to);
}
- function special_presence($type, $to=NULL, $show=NULL, $status=NULL) {
- $to = htmlspecialchars($to);
- $status = htmlspecialchars($status);
- $out = "<presence";
- if($to) $out .= " to='$to'";
- if($type) $out .= " type='$type'";
- if($show == 'available' and !$status) {
- $out .= "/>";
- } else {
- $out .= ">";
- if($show && ($show != 'available')) $out .= "<show>$show</show>";
- if($status) $out .= "<status>$status</status>";
- $out .= "</presence>";
- }
- $this->conn->send($out);
+ function set_status($status) {
+ $this->log(LOG_INFO, 'Setting status to "' . $status . '"');
+ jabber_send_presence($status);
}
}
-$daemon = new XMPPDaemon();
+$resource = ($argc > 1) ? $argv[1] : NULL;
+
+$daemon = new XMPPDaemon($resource);
if ($daemon->connect()) {
+ $daemon->set_status("Send me a message to post a notice");
$daemon->handle();
}
+
?>