-
- function set_status($status) {
- $this->log(LOG_INFO, 'Setting status to "' . $status . '"');
- jabber_send_presence($status);
- }
-
- function top_queue_item() {
-
- $qi = new Queue_item();
- $qi->orderBy('created');
- $qi->whereAdd('claimed is NULL');
-
- $qi->limit(1);
-
- $cnt = $qi->find(TRUE);
-
- if ($cnt) {
- # XXX: potential race condition
- # can we force it to only update if claimed is still NULL
- # (or old)?
- $this->log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id);
- $orig = clone($qi);
- $qi->claimed = DB_DataObject_Cast::dateTime();
- $result = $qi->update($orig);
- if ($result) {
- $this->log(LOG_INFO, 'claim succeeded.');
- return $qi;
- } else {
- $this->log(LOG_INFO, 'claim failed.');
- }
- }
- $qi = NULL;
- return NULL;
- }
-
- function broadcast_queue() {
- $this->clear_old_claims();
- $this->log(LOG_INFO, 'checking for queued notices');
- do {
- $qi = $this->top_queue_item();
- if ($qi) {
- $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created));
- $notice = Notice::staticGet($qi->notice_id);
- if ($notice) {
- $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id);
- # XXX: what to do if broadcast fails?
- $result = common_real_broadcast($notice, $this->is_remote($notice));
- if (!$result) {
- $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id);
- $orig = $qi;
- $qi->claimed = NULL;
- $qi->update($orig);
- $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id);
- continue;
- }
- $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id);
- $notice = NULL;
- } else {
- $this->log(LOG_WARNING, 'queue item for notice that does not exist');
- }
- $qi->delete();
- }
- } while ($qi);
- }
-
- function clear_old_claims() {
- $qi = new Queue_item();
- $qi->claimed = NULL;
- $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
- $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
- }
-
- function is_remote($notice) {
- $user = User::staticGet($notice->profile_id);
- return !$user;
- }
-
- function confirmation_queue() {
- # $this->clear_old_confirm_claims();
- $this->log(LOG_INFO, 'checking for queued confirmations');
- do {
- $confirm = $this->next_confirm();
- if ($confirm) {
- $this->log(LOG_INFO, 'Sending confirmation for ' . $confirm->address);
- $user = User::staticGet($confirm->user_id);
- if (!$user) {
- $this->log(LOG_WARNING, 'Confirmation for unknown user ' . $confirm->user_id);
- continue;
- }
- $success = jabber_confirm_address($confirm->code,
- $user->nickname,
- $confirm->address);
- if (!$success) {
- $this->log(LOG_ERR, 'Confirmation failed for ' . $confirm->address);
- # Just let the claim age out; hopefully things work then
- continue;
- } else {
- $this->log(LOG_INFO, 'Confirmation sent for ' . $confirm->address);
- # Mark confirmation sent
- $original = clone($confirm);
- $confirm->sent = $confirm->claimed;
- $result = $confirm->update($original);
- if (!$result) {
- $this->log(LOG_ERR, 'Cannot mark sent for ' . $confirm->address);
- # Just let the claim age out; hopefully things work then
- continue;
- }
- }
- }
- } while ($confirm);
- }
-
- function next_confirm() {
- $confirm = new Confirm_address();
- $confirm->whereAdd('claimed IS NULL');
- $confirm->whereAdd('sent IS NULL');
- # XXX: eventually we could do other confirmations in the queue, too
- $confirm->address_type = 'jabber';
- $confirm->orderBy('modified DESC');
- $confirm->limit(1);
- if ($confirm->find(TRUE)) {
- $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
- # working around some weird DB_DataObject behaviour
- $confirm->whereAdd(''); # clears where stuff
- $original = clone($confirm);
- $confirm->claimed = DB_DataObject_Cast::dateTime();
- $result = $confirm->update($original);
- if ($result) {
- $this->log(LOG_INFO, 'Succeeded in claim! '. $result);
- return $confirm;
- } else {
- $this->log(LOG_INFO, 'Failed in claim!');
- return false;
- }
- }
- return NULL;
- }
-
- function clear_old_confirm_claims() {
- $confirm = new Confirm();
- $confirm->claimed = NULL;
- $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
- $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
- }
-