+ /**
+ * Reset failed server status by gserver id
+ *
+ * @param int $gsid
+ * @param string $network
+ */
+ public static function setReachableById(int $gsid, string $network)
+ {
+ $gserver = DBA::selectFirst('gserver', ['url', 'failed', 'next_contact', 'network'], ['id' => $gsid]);
+ if (!DBA::isResult($gserver)) {
+ return;
+ }
+
+ $blocked = Network::isUrlBlocked($gserver['url']);
+ if ($gserver['failed']) {
+ $fields = ['failed' => false, 'blocked' => $blocked, 'last_contact' => DateTimeFormat::utcNow()];
+ if (!empty($network) && !in_array($gserver['network'], Protocol::FEDERATED)) {
+ $fields['network'] = $network;
+ }
+ self::update($fields, ['id' => $gsid]);
+ Logger::info('Reset failed status for server', ['url' => $gserver['url']]);
+
+ if (strtotime($gserver['next_contact']) < time()) {
+ UpdateGServer::add(Worker::PRIORITY_LOW, $gserver['url']);
+ }
+ } elseif ($blocked) {
+ self::setBlockedById($gsid);
+ } else {
+ self::setUnblockedById($gsid);
+ }
+ }
+
+ /**
+ * Set failed server status by gserver id
+ *
+ * @param int $gsid
+ */
+ public static function setFailureById(int $gsid)
+ {
+ $gserver = DBA::selectFirst('gserver', ['url', 'failed', 'next_contact'], ['id' => $gsid]);
+ if (DBA::isResult($gserver) && !$gserver['failed']) {
+ self::update(['failed' => true, 'blocked' => Network::isUrlBlocked($gserver['url']), 'last_failure' => DateTimeFormat::utcNow()], ['id' => $gsid]);
+ Logger::info('Set failed status for server', ['url' => $gserver['url']]);
+
+ if (strtotime($gserver['next_contact']) < time()) {
+ UpdateGServer::add(Worker::PRIORITY_LOW, $gserver['url']);
+ }
+ }
+ }
+
+ public static function setUnblockedById(int $gsid)
+ {
+ $gserver = DBA::selectFirst('gserver', ['url'], ["(`blocked` OR `blocked` IS NULL) AND `id` = ?", $gsid]);
+ if (DBA::isResult($gserver)) {
+ self::update(['blocked' => false], ['id' => $gsid]);
+ Logger::info('Set unblocked status for server', ['url' => $gserver['url']]);
+ }
+ }
+
+ public static function setBlockedById(int $gsid)
+ {
+ $gserver = DBA::selectFirst('gserver', ['url'], ["(NOT `blocked` OR `blocked` IS NULL) AND `id` = ?", $gsid]);
+ if (DBA::isResult($gserver)) {
+ self::update(['blocked' => true, 'failed' => true], ['id' => $gsid]);
+ Logger::info('Set blocked status for server', ['url' => $gserver['url']]);
+ }
+ }
+
+ public static function setBlockedByUrl(string $url)
+ {
+ $gserver = DBA::selectFirst('gserver', ['url', 'id'], ["(NOT `blocked` OR `blocked` IS NULL) AND `nurl` = ?", Strings::normaliseLink($url)]);
+ if (DBA::isResult($gserver)) {
+ self::update(['blocked' => true, 'failed' => true], ['id' => $gserver['id']]);
+ Logger::info('Set blocked status for server', ['url' => $gserver['url']]);
+ }
+ }
+