X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fjabber.php;h=ab0fd6af8663a6490e3df5dbc9c088e0894c1380;hb=2abe10b8ea4b5d69fc7f6513bf465541454ca2cf;hp=5dde76f14e6720e44f046de3dd75ee4dcdb2cee3;hpb=b17bb9861c0e6b0cc4e72c7ef2d322e168353c25;p=quix0rs-gnu-social.git diff --git a/lib/jabber.php b/lib/jabber.php index 5dde76f14e..ab0fd6af86 100644 --- a/lib/jabber.php +++ b/lib/jabber.php @@ -21,33 +21,6 @@ if (!defined('LACONICA')) { exit(1); } 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 = "send($out); - } -} - function jabber_valid_base_jid($jid) { # Cheap but effective return Validate::email($jid); @@ -67,10 +40,10 @@ function jabber_daemon_address() { 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'), @@ -84,19 +57,22 @@ function jabber_connect($resource=NULL, $status=NULL, $priority=NULL) { 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; } @@ -116,6 +92,7 @@ function jabber_send_notice($to, $notice) { $msg = jabber_format_notice($profile, $notice); $entry = jabber_format_entry($profile, $notice); $conn->message($to, $msg, 'chat', NULL, $entry); + $profile->free(); return true; } @@ -146,7 +123,7 @@ function jabber_format_entry($profile, $notice) { $html = "\n\n"; $html .= "\n"; - $html .= "".$profile->nickname.": "; + $html .= "".$profile->nickname.": "; $html .= ($notice->rendered) ? $notice->rendered : common_render_content($notice->content, $notice); $html .= "\n\n"; $html .= "\n\n"; @@ -155,15 +132,9 @@ function jabber_format_entry($profile, $notice) { $address .= "
\n"; $address .= "\n"; - $event = "\n"; - $event .= "\n"; - $event .= "\n"; - $event .= "\n"; - $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) { @@ -175,12 +146,14 @@ 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; } @@ -232,6 +205,9 @@ function jabber_broadcast_notice($notice) { $msg = jabber_format_notice($profile, $notice); $entry = jabber_format_entry($profile, $notice); + $profile->free(); + unset($profile); + $sent_to = array(); $conn = jabber_connect(); @@ -249,8 +225,12 @@ function jabber_broadcast_notice($notice) { '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(); @@ -258,7 +238,8 @@ function jabber_broadcast_notice($notice) { 'FROM user JOIN subscription ON user.id = subscription.subscriber ' . 'WHERE subscription.subscribed = ' . $notice->profile_id . ' ' . 'AND user.jabber is not null ' . - 'AND user.jabbernotify = 1 '); + 'AND user.jabbernotify = 1 ' . + 'AND subscription.jabber = 1 '); while ($user->fetch()) { if (!array_key_exists($user->id, $sent_to)) { @@ -266,9 +247,13 @@ function jabber_broadcast_notice($notice) { '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; } @@ -283,6 +268,15 @@ function jabber_public_notice($notice) { # = false? I think not if ($public && $notice->is_local) { + $profile = Profile::staticGet($notice->profile_id); + + if (!$profile) { + common_log(LOG_WARNING, 'Refusing to broadcast notice with ' . + 'unknown profile ' . common_log_objstring($notice), + __FILE__); + return false; + } + $msg = jabber_format_notice($profile, $notice); $entry = jabber_format_entry($profile, $notice); @@ -293,7 +287,9 @@ function jabber_public_notice($notice) { 'Sending notice ' . $notice->id . ' to public listener ' . $address, __FILE__); $conn->message($address, $msg, 'chat', NULL, $entry); + $conn->processTime(0); } + $profile->free(); } return true;