setName('talk:signaling:add') ->setDescription('Add an external signaling server.') ->addArgument( 'server', InputArgument::REQUIRED, 'A server string, ex. wss://signaling.example.org' )->addArgument( 'secret', InputArgument::REQUIRED, 'A shared secret string.' )->addOption( 'verify', null, InputOption::VALUE_NONE, 'Validate SSL certificate if set.' ); } protected function execute(InputInterface $input, OutputInterface $output): int { $server = $input->getArgument('server'); $secret = $input->getArgument('secret'); $verify = $input->getOption('verify'); // quick validation, similar to signaling-server.js if (trim($server) === '') { $output->writeln('Server cannot be empty.'); return 1; } if (trim($secret) === '') { $output->writeln('Secret cannot be empty.'); return 1; } $config = $this->config->getAppValue('spreed', 'signaling_servers'); $signaling = json_decode($config, true); if ($signaling === null || empty($signaling) || !is_array($signaling)) { $servers = []; } else { $servers = is_array($signaling['servers']) ? $signaling['servers'] : []; } $servers[] = [ 'server' => $server, 'verify' => $verify, ]; $signaling = [ 'servers' => $servers, 'secret' => $secret, ]; $this->config->setAppValue('spreed', 'signaling_servers', json_encode($signaling)); $output->writeln('Added signaling server ' . $server . '.'); return 0; } }