. * */ namespace Friendica\Console; use Asika\SimpleConsole\CommandArgsException; use Friendica\Model\APContact; use Friendica\Model\Contact; use Friendica\Protocol\ActivityPub\Transmitter; /** * tool to control the list of ActivityPub relay servers from the CLI * * With this script you can access the relay servers of your node from * the CLI. */ class Relay extends \Asika\SimpleConsole\Console { protected $helpOptions = ['h', 'help', '?']; /** * @var $dba Friendica\Database\Database */ private $dba; protected function getHelp() { $help = << [-h|--help|-?] [-v] bin/console relay remove [-h|--help|-?] [-v] Description bin/console relay Lists all active relay servers bin/console relay add Add a relay actor in the format https://relayserver.tld/actor bin/console relay remove Remove a relay actor in the format https://relayserver.tld/actor Options -h|--help|-? Show help information -v Show more debug information. HELP; return $help; } public function __construct(\Friendica\Database\Database $dba, array $argv = null) { parent::__construct($argv); $this->dba = $dba; } protected function doExecute() { if ($this->getOption('v')) { $this->out('Executable: ' . $this->executable); $this->out('Class: ' . __CLASS__); $this->out('Arguments: ' . var_export($this->args, true)); $this->out('Options: ' . var_export($this->options, true)); } if (count($this->args) > 2) { throw new CommandArgsException('Too many arguments'); } if (count($this->args) == 1) { throw new CommandArgsException('Too few arguments'); } if (count($this->args) == 0) { $contacts = $this->dba->select('apcontact', ['url'], ["`type` = ? AND `url` IN (SELECT `url` FROM `contact` WHERE `uid` = ? AND `rel` IN (?, ?))", 'Application', 0, Contact::FOLLOWER, Contact::FRIEND]); while ($contact = $this->dba->fetch($contacts)) { $this->out($contact['url']); } $this->dba->close($contacts); } if (count($this->args) == 2) { $mode = $this->getArgument(0); $actor = $this->getArgument(1); $apcontact = APContact::getByURL($actor); if (empty($apcontact) || ($apcontact['type'] != 'Application')) { $this->out($actor . ' is no relay actor'); return 1; } if ($mode == 'add') { if (Transmitter::sendRelayFollow($actor)) { $this->out('Successfully added ' . $actor); } else { $this->out($actor . " couldn't be added"); } } elseif ($mode == 'remove') { if (Transmitter::sendRelayUndoFollow($actor)) { $this->out('Successfully removed ' . $actor); } else { $this->out($actor . " couldn't be removed"); } } else { throw new CommandArgsException($mode . ' is no valid command'); } } return 0; } }