// Add internal fields
$removal = [];
if (!empty($fields)) {
- foreach (['id', 'next-update', 'network'] as $internal) {
+ foreach (['id', 'next-update', 'network', 'local-data'] as $internal) {
if (!in_array($internal, $fields)) {
$fields[] = $internal;
$removal[] = $internal;
return [];
}
+ $background_update = DI::config()->get('system', 'update_active_contacts') ? $contact['local-data'] : true;
+
// Update the contact in the background if needed
- if (Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
+ if ($background_update && !self::isLocal($url) && Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
Worker::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']);
}
return 0;
}
- $contact = self::getByURL($url, false, ['id', 'network', 'uri-id', 'next-update'], $uid);
+ $contact = self::getByURL($url, false, ['id', 'network', 'uri-id', 'next-update', 'local-data'], $uid);
if (!empty($contact)) {
$contact_id = $contact['id'];
- if (Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
+ $background_update = DI::config()->get('system', 'update_active_contacts') ? $contact['local-data'] : true;
+
+ if ($background_update && !self::isLocal($url) && Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
Worker::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']);
}
$contact_field = ((($contact["contact-type"] == self::TYPE_COMMUNITY) || ($contact['network'] == Protocol::MAIL)) ? 'owner-id' : 'author-id');
if ($thread_mode) {
- $condition = ["((`$contact_field` = ? AND `gravity` = ?) OR (`author-id` = ? AND `gravity` = ? AND `vid` = ? AND `thr-parent-id` = `parent-uri-id`)) AND " . $sql,
- $cid, Item::GRAVITY_PARENT, $cid, Item::GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), DI::userSession()->getLocalUserId()];
+ $condition = ["((`$contact_field` = ? AND `gravity` = ?) OR (`author-id` = ? AND `gravity` = ? AND `vid` = ? AND `protocol` != ? AND `thr-parent-id` = `parent-uri-id`)) AND " . $sql,
+ $cid, Item::GRAVITY_PARENT, $cid, Item::GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), Conversation::PARCEL_DIASPORA, DI::userSession()->getLocalUserId()];
} else {
$condition = ["`$contact_field` = ? AND `gravity` IN (?, ?) AND " . $sql,
$cid, Item::GRAVITY_PARENT, Item::GRAVITY_COMMENT, DI::userSession()->getLocalUserId()];
return true;
}
+ /**
+ * Perform a contact update if the contact is outdated
+ *
+ * @param integer $id contact id
+ * @return bool
+ */
+ public static function updateByIdIfNeeded(int $id): bool
+ {
+ $contact = self::selectFirst(['url'], ["`id` = ? AND `next-update` < ?", $id, DateTimeFormat::utcNow()]);
+ if (empty($contact['url'])) {
+ return false;
+ }
+
+ if (self::isLocal($contact['url'])) {
+ return true;
+ }
+
+ $stamp = (float)microtime(true);
+ self::updateFromProbe($id);
+ Logger::debug('Contact data is updated.', ['duration' => round((float)microtime(true) - $stamp, 3), 'id' => $id, 'url' => $contact['url'], 'callstack' => System::callstack(20)]);
+ return true;
+ }
+
+ /**
+ * Perform a contact update if the contact is outdated
+ *
+ * @param string $url contact url
+ * @return bool
+ */
+ public static function updateByUrlIfNeeded(string $url): bool
+ {
+ $id = self::getIdForURL($url, 0, false);
+ if (!empty($id)) {
+ return self::updateByIdIfNeeded($id);
+ }
+ return (bool)self::getIdForURL($url);
+ }
+
/**
* Updates contact record by provided id and optional network
*
}
if (($network != '') && ($ret['network'] != $network)) {
- Logger::notice('Expected network ' . $network . ' does not match actual network ' . $ret['network']);
+ $result['message'] = DI::l10n()->t('Expected network %s does not match actual network %s', $network, $ret['network']);
return $result;
}