<?php
/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
/**
* Base class for relay handling
+ * @see https://github.com/jaywink/social-relay
+ * @see https://wiki.diasporafoundation.org/Relay_servers_for_public_posts
*/
class Relay
{
+ const SCOPE_NONE = '';
+ const SCOPE_ALL = 'all';
+ const SCOPE_TAGS = 'tags';
+
/**
* Check if a post is wanted
*
* @param string $url
* @return boolean "true" is the post is wanted by the system
*/
- public static function isSolicitedPost(array $tags, string $body, int $authorid, string $url, string $network = '')
+ public static function isSolicitedPost(array $tags, string $body, int $authorid, string $url, string $network = ''): bool
{
$config = DI::config();
$scope = $config->get('system', 'relay_scope');
- if ($scope == SR_SCOPE_NONE) {
+ if ($scope == self::SCOPE_NONE) {
Logger::info('Server does not accept relay posts - rejected', ['network' => $network, 'url' => $url]);
return false;
}
$userTags = [];
$denyTags = [];
- if ($scope == SR_SCOPE_TAGS) {
+ if ($scope == self::SCOPE_TAGS) {
$server_tags = $config->get('system', 'relay_server_tags');
$tagitems = explode(',', mb_strtolower($server_tags));
- foreach ($tagitems AS $tag) {
+ foreach ($tagitems as $tag) {
$systemTags[] = trim($tag, '# ');
}
$deny_tags = $config->get('system', 'relay_deny_tags');
$tagitems = explode(',', mb_strtolower($deny_tags));
- foreach ($tagitems AS $tag) {
+ foreach ($tagitems as $tag) {
$tag = trim($tag, '# ');
$denyTags[] = $tag;
}
}
}
- if ($scope == SR_SCOPE_ALL) {
+ if ($scope == self::SCOPE_ALL) {
Logger::info('Server accept all posts - accepted', ['network' => $network, 'url' => $url]);
return true;
}
*
* @param array $gserver Global server record
* @param array $fields Optional network specific fields
+ * @return void
* @throws \Exception
*/
public static function updateContact(array $gserver, array $fields = [])
* The relay contact is a technical contact entry that exists once per server.
*
* @param array $contact of the relay contact
+ * @return void
*/
public static function markForArchival(array $contact)
{
* @param integer $item_id id of the item that is sent
* @param array $contacts Previously fetched contacts
* @param array $networks Networks of the relay servers
- *
* @return array of relay servers
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
- public static function getDirectRelayList(int $item_id)
+ public static function getDirectRelayList(int $item_id): array
{
$serverlist = [];
- if (!DI::config()->get("system", "relay_directly", false)) {
+ if (!DI::config()->get('system', 'relay_directly', false)) {
return [];
}
* Return a list of relay servers
*
* @param array $fields Field list
- * @return array
+ * @return array List of relay servers
* @throws Exception
*/
- public static function getList($fields = []):array
+ public static function getList(array $fields = []): array
{
return DBA::selectToArray('apcontact', $fields,
["`type` = ? AND `url` IN (SELECT `url` FROM `contact` WHERE `uid` = ? AND `rel` = ?)", 'Application', 0, Contact::FRIEND]);
*
* @param array $gserver Global server record
* @param array $fields Fieldlist
- * @return array with the contact
+ * @return array|bool Array with the contact or false on error
* @throws \Exception
*/
private static function getContact(array $gserver, array $fields = ['batch', 'id', 'url', 'name', 'network', 'protocol', 'archive', 'blocked'])
// It should never happen that we arrive here
return [];
}
+
+ /**
+ * Resubscribe to all relay servers
+ *
+ * @return void
+ */
+ public static function reSubscribe()
+ {
+ foreach (self::getList() as $server) {
+ $success = ActivityPub\Transmitter::sendRelayFollow($server['url']);
+ Logger::debug('Resubscribed', ['profile' => $server['url'], 'success' => $success]);
+ }
+ }
}