optionally queue jabber confirmations

darcs-hash:20080706035707-84dde-5403fe9bcb017c401fe5847527628df548e54499.gz
This commit is contained in:
Evan Prodromou 2008-07-05 23:57:07 -04:00
parent 13ac93481c
commit e4a1b9cde9
3 changed files with 74 additions and 11 deletions

View File

@ -185,11 +185,11 @@ class ImsettingsAction extends SettingsAction {
return; return;
} }
# XXX: queue for offline sending if (!common_config('queue', 'enabled')) {
jabber_confirm_address($confirm->code, jabber_confirm_address($confirm->code,
$user->nickname, $user->nickname,
$jabber); $jabber);
}
# XXX: I18N # XXX: I18N
@ -246,9 +246,7 @@ class ImsettingsAction extends SettingsAction {
} }
$user->query('COMMIT'); $user->query('COMMIT');
# Unsubscribe to the old address # XXX: unsubscribe to the old address
jabber_special_presence('unsubscribe', $jabber);
$this->show_form(_t('The address was removed.'), TRUE); $this->show_form(_t('The address was removed.'), TRUE);
} }

View File

@ -93,7 +93,7 @@ function jabber_confirm_address($code, $nickname, $address) {
'address bar of your browser). If that user isn\'t you, ' . 'address bar of your browser). If that user isn\'t you, ' .
'or if you didn\'t request this confirmation, just ignore this message.'; 'or if you didn\'t request this confirmation, just ignore this message.';
jabber_send_message($address, $body); return jabber_send_message($address, $body);
} }
function jabber_special_presence($type, $to=NULL, $show=NULL, $status=NULL) { function jabber_special_presence($type, $to=NULL, $show=NULL, $status=NULL) {

View File

@ -93,6 +93,7 @@ class XMPPDaemon {
} }
$this->broadcast_queue(); $this->broadcast_queue();
$this->confirmation_queue();
} }
} }
@ -312,7 +313,6 @@ class XMPPDaemon {
function clear_old_claims() { function clear_old_claims() {
$qi = new Queue_item(); $qi = new Queue_item();
$qi->claimed = NULL;
$qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT); $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
$qi->update(DB_DATAOBJECT_WHEREADD_ONLY); $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
} }
@ -321,6 +321,71 @@ class XMPPDaemon {
$user = User::staticGet($notice->profile_id); $user = User::staticGet($notice->profile_id);
return !$user; 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,
$jabber);
if (!$success) {
$this->log(LOG_ERROR, '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 = DB_DataObject_Cast::dateTime();
$result = $confirm->update($original);
if (!$result) {
$this->log(LOG_ERROR, '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->sent = NULL;
$confirm->claimed = NULL;
$confirm->orderBy('modified DESC');
$confirm->limit(1);
if ($confirm->find(TRUE)) {
$this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
$original = clone($confirm);
$confirm->claimed = DB_DataObject_Cast::dateTime();
$result = $confirm->update($original);
if ($result) {
$this->log(LOG_INFO, 'Succeeded in claim!');
return $confirm;
} else {
$this->log(LOG_INFO, 'Failed in claim!');
return false;
}
}
return NULL;
}
function clear_old_confirm_claims() {
$confirm = new Confirm();
$confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
$confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
}
} }
$resource = ($argc > 1) ? $argv[1] : NULL; $resource = ($argc > 1) ? $argv[1] : NULL;