pixelfed/app/Services/Internal/BeagleService.php

128 lines
3.9 KiB
PHP

<?php
namespace App\Services\Internal;
use App\Services\InstanceService;
use App\Services\StatusService;
use App\Util\ActivityPub\Helpers;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\RequestException;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
class BeagleService
{
const DEFAULT_RULES_CACHE_KEY = 'pf:services:beagle:default_rules:v1';
const DISCOVER_CACHE_KEY = 'pf:services:beagle:discover:v1';
const DISCOVER_POSTS_CACHE_KEY = 'pf:services:beagle:discover-posts:v1';
public static function getDefaultRules()
{
return Cache::remember(self::DEFAULT_RULES_CACHE_KEY, now()->addDays(7), function () {
try {
$res = Http::withOptions(['allow_redirects' => false])
->timeout(5)
->connectTimeout(5)
->retry(2, 500)
->get('https://beagle.pixelfed.net/api/v1/common/suggestions/rules');
} catch (RequestException $e) {
return;
} catch (ConnectionException $e) {
return;
} catch (Exception $e) {
return;
}
if (! $res->ok()) {
return;
}
$json = $res->json();
if (! isset($json['rule_suggestions']) || ! count($json['rule_suggestions'])) {
return [];
}
return $json['rule_suggestions'];
});
}
public static function getDiscover()
{
if ((bool) config_cache('federation.activitypub.enabled') == false) {
return [];
}
return Cache::remember(self::DISCOVER_CACHE_KEY, now()->addHours(6), function () {
try {
$res = Http::withOptions(['allow_redirects' => false])
->withHeaders([
'X-Pixelfed-Api' => 1,
])->timeout(5)
->connectTimeout(5)
->retry(2, 500)
->get('https://beagle.pixelfed.net/api/v1/discover');
} catch (RequestException $e) {
return;
} catch (ConnectionException $e) {
return;
} catch (Exception $e) {
return;
}
if (! $res->ok()) {
return;
}
$json = $res->json();
if (! isset($json['statuses']) || ! count($json['statuses'])) {
return [];
}
return $json['statuses'];
});
}
public static function getDiscoverPosts()
{
if ((bool) config_cache('federation.activitypub.enabled') == false) {
return [];
}
return Cache::remember(self::DISCOVER_POSTS_CACHE_KEY, now()->addHours(1), function () {
$posts = collect(self::getDiscover())
->filter(function ($post) {
$bannedInstances = InstanceService::getBannedDomains();
$domain = parse_url($post['id'], PHP_URL_HOST);
return ! in_array($domain, $bannedInstances);
})
->map(function ($post) {
$domain = parse_url($post['id'], PHP_URL_HOST);
if ($domain === config_cache('pixelfed.domain.app')) {
$parts = explode('/', $post['id']);
$id = array_last($parts);
return StatusService::get($id);
}
$post = Helpers::statusFetch($post['id']);
if (! $post) {
return;
}
$id = $post->id;
return StatusService::get($id);
})
->filter()
->values()
->toArray();
return $posts;
});
}
}