require_once('XMPPHP/XMPP.php');
-# XXX: something of a hack to work around problems with the XMPPHP lib
-
-class Laconica_XMPP extends XMPPHP_XMPP {
-
- public function presence($status = null, $show = 'available', $to = null, $type='available', $priority=NULL) {
- if($type == 'available') $type = '';
- $to = htmlspecialchars($to);
- $status = htmlspecialchars($status);
- if($show == 'unavailable') $type = 'unavailable';
-
- $out = "<presence";
- if($to) $out .= " to='$to'";
- if($type) $out .= " type='$type'";
- if($show == 'available' and !$status and is_null($priority)) {
- $out .= "/>";
- } else {
- $out .= ">";
- if($show != 'available') $out .= "<show>$show</show>";
- if($status) $out .= "<status>$status</status>";
- if(!is_null($priority)) $out .= "<priority>$priority</priority>";
- $out .= "</presence>";
- }
-
- $this->send($out);
- }
-}
-
function jabber_valid_base_jid($jid) {
# Cheap but effective
return Validate::email($jid);
return common_config('xmpp', 'user') . '@' . common_config('xmpp', 'server');
}
-function jabber_connect($resource=NULL, $status=NULL, $priority=NULL) {
+function jabber_connect($resource=NULL) {
static $conn = NULL;
if (!$conn) {
- $conn = new Laconica_XMPP(common_config('xmpp', 'host') ?
+ $conn = new XMPPHP_XMPP(common_config('xmpp', 'host') ?
common_config('xmpp', 'host') :
common_config('xmpp', 'server'),
common_config('xmpp', 'port'),
common_config('xmpp', 'debug') ?
XMPPHP_Log::LEVEL_VERBOSE : NULL
);
- $conn->autoSubscribe();
- $conn->useEncryption(common_config('xmpp', 'encryption'));
if (!$conn) {
return false;
}
- $conn->connect(true); # true = persistent connection
- if ($conn->isDisconnected()) {
+
+ $conn->autoSubscribe();
+ $conn->useEncryption(common_config('xmpp', 'encryption'));
+
+ try {
+ $conn->connect(true); # true = persistent connection
+ } catch (XMPPHP_Exception $e) {
+ common_log(LOG_ERROR, $e->getMessage());
return false;
}
+
$conn->processUntil('session_start');
- $conn->getRoster();
- $conn->presence($presence, 'available', NULL, 'available', $priority);
}
return $conn;
}
$msg = jabber_format_notice($profile, $notice);
$entry = jabber_format_entry($profile, $notice);
$conn->message($to, $msg, 'chat', NULL, $entry);
+ $profile->free();
return true;
}
$address .= "<address type='replyto' jid='" . jabber_daemon_address() . "' />\n";
$address .= "</addresses>\n";
- $event = "<event xmlns='http://jabber.org/protocol/pubsub#event'>\n";
- $event .= "<items xmlns='http://jabber.org/protocol/pubsub' ";
- $event .= "node='" . common_local_url('public') . "'>\n";
- $event .= "<item id='" . $notice->uri ."' />\n";
- $event .= "</items>\n";
- $event .= "</event>\n";
- # FIXME: include the pubsub event, too.
+ # FIXME: include a pubsub event, too.
+
return $html . $entry . $address;
-# return $entry . "\n" . $event;
}
function jabber_send_message($to, $body, $type='chat', $subject=NULL) {
return true;
}
-function jabber_send_presence($status, $show='available', $to=Null) {
+function jabber_send_presence($status, $show='available', $to=NULL,
+ $type = 'available', $priority=NULL)
+{
$conn = jabber_connect();
if (!$conn) {
return false;
}
- $conn->presence($status, $show, $to);
+ $conn->presence($status, $show, $to, $type, $priority);
return true;
}
$msg = jabber_format_notice($profile, $notice);
$entry = jabber_format_entry($profile, $notice);
+ $profile->free();
+ unset($profile);
+
$sent_to = array();
$conn = jabber_connect();
'Sending reply notice ' . $notice->id . ' to ' . $user->jabber,
__FILE__);
$conn->message($user->jabber, $msg, 'chat', NULL, $entry);
+ $conn->processTime(0);
+ $sent_to[$user->id] = 1;
}
+ $user->free();
+
# Now, get users subscribed to this profile
$user = new User();
'Sending notice ' . $notice->id . ' to ' . $user->jabber,
__FILE__);
$conn->message($user->jabber, $msg, 'chat', NULL, $entry);
+ # To keep the incoming queue from filling up, we service it after each send.
+ $conn->processTime(0);
}
}
+ $user->free();
+
return true;
}
'Sending notice ' . $notice->id . ' to public listener ' . $address,
__FILE__);
$conn->message($address, $msg, 'chat', NULL, $entry);
+ $conn->processTime(0);
}
+ $profile->free();
}
return true;