- # XXX: use a join here rather than looping through results
- $sub = new Subscription();
- $sub->subscribed = $notice->profile_id;
-
- if ($sub->find()) {
- while ($sub->fetch()) {
- $user = User::staticGet($sub->subscriber);
- if ($user && $user->jabber && $user->jabbernotify && !$sent_to[$user->id]) {
- common_log(LOG_INFO,
- 'Sending notice ' . $notice->id . ' to ' . $user->jabber,
- __FILE__);
- $success = jabber_send_notice($user->jabber, $notice);
- if ($success) {
- $sent_to[$user->id] = true;
- } else {
- # XXX: Not sure, but I think that's the right thing to do
- common_log(LOG_WARNING,
- 'Sending notice ' . $notice->id . ' to ' . $user->jabber . ' FAILED, cancelling.',
- __FILE__);
- return false;
- }
- }
+
+ $user = new User();
+ $user->query('SELECT user.id, user.jabber ' .
+ '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 subscription.jabber = 1 ');
+
+ while ($user->fetch()) {
+ if (!array_key_exists($user->id, $sent_to)) {
+ common_log(LOG_INFO,
+ '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;
+}
+
+function jabber_public_notice($notice) {
+
+ # Now, users who want everything
+
+ $public = common_config('xmpp', 'public');
+
+ # FIXME PRIV don't send out private messages here
+ # XXX: should we send out non-local messages if public,localonly
+ # = 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);
+
+ $conn = jabber_connect();
+
+ foreach ($public as $address) {
+ common_log(LOG_INFO,
+ 'Sending notice ' . $notice->id . ' to public listener ' . $address,
+ __FILE__);
+ $conn->message($address, $msg, 'chat', NULL, $entry);
+ $conn->processTime(0);