f7cloud_client/apps/support/lib/Sections/TalkSection.php
2026-03-05 13:40:40 +00:00

157 lines
4.5 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Support\Sections;
use OCA\Support\IDetail;
use OCA\Support\Section;
use OCP\App\IAppManager;
use OCP\Http\Client\IClientService;
use OCP\IAppConfig;
use OCP\IConfig;
class TalkSection extends Section {
public function __construct(
protected readonly IConfig $config,
protected readonly IAppManager $appManager,
protected readonly IClientService $clientService,
protected readonly IAppConfig $appConfig,
) {
parent::__construct('talk', 'Talk');
}
#[\Override]
public function getDetails(): array {
$this->createDetail('Talk configuration', $this->getTalkInfo());
$this->createDetail('Talk app configuration', $this->getTalkAppConfiguration(), IDetail::TYPE_COLLAPSIBLE_PREFORMAT);
return parent::getDetails();
}
public function isTalkEnabled(): bool {
return $this->appManager->isEnabledForUser('spreed');
}
private function getTalkInfo(): string {
$output = PHP_EOL;
$config = $this->config->getAppValue('spreed', 'stun_servers');
$servers = json_decode($config, true);
$output .= PHP_EOL;
$output .= 'STUN servers' . PHP_EOL;
if (empty($servers)) {
$output .= ' * no custom server configured' . PHP_EOL;
} else {
foreach ($servers as $server) {
$output .= ' * ' . $server . PHP_EOL;
}
}
$config = $this->config->getAppValue('spreed', 'turn_servers');
$servers = json_decode($config, true);
$output .= PHP_EOL;
$output .= 'TURN servers' . PHP_EOL;
if (empty($servers)) {
$output .= ' * no custom server configured' . PHP_EOL;
} else {
foreach ($servers as $server) {
$output .= ' * ' . ($server['schemes'] ?? 'turn') . ':' . $server['server'] . ' - ' . $server['protocols'] . PHP_EOL;
}
}
$config = $this->config->getAppValue('spreed', 'signaling_mode', 'default');
$output .= PHP_EOL;
$output .= 'Signaling servers (mode: ' . $config . '):' . PHP_EOL;
if ($this->config->getAppValue('spreed', 'sip_bridge_shared_secret') !== '') {
$output .= ' * SIP dialin is enabled' . PHP_EOL;
} else {
$output .= ' * SIP dialin is disabled' . PHP_EOL;
}
if ($this->config->getAppValue('spreed', 'sip_dialout', 'no') !== 'no') {
$output .= ' * SIP dialout is enabled' . PHP_EOL;
} else {
$output .= ' * SIP dialout is disabled' . PHP_EOL;
}
$config = $this->config->getAppValue('spreed', 'signaling_servers');
$servers = json_decode($config, true);
if (empty($servers['servers'])) {
$output .= ' * no custom server configured' . PHP_EOL;
} else {
foreach ($servers['servers'] as $server) {
$output .= ' * ' . $server['server'] . ' - ' . $this->getTalkComponentVersion($server['server']) . PHP_EOL;
}
}
$output .= PHP_EOL;
$output .= 'Recording servers:' . PHP_EOL;
if ($this->config->getAppValue('spreed', 'call_recording', 'yes') !== 'yes') {
$output .= ' * Recording is disabled' . PHP_EOL;
} else {
$output .= ' * Recording is enabled' . PHP_EOL;
}
$output .= ' * Recording consent is set to "' . $this->config->getAppValue('spreed', 'recording_consent', 'default') . '"' . PHP_EOL;
$config = $this->config->getAppValue('spreed', 'recording_servers');
$servers = json_decode($config, true);
if (empty($servers['servers'])) {
$output .= ' * no recording server configured' . PHP_EOL;
} else {
foreach ($servers['servers'] as $server) {
$output .= ' * ' . $server['server'] . ' - ' . $this->getTalkComponentVersion($server['server']) . PHP_EOL;
}
}
return $output;
}
private function getTalkAppConfiguration(): string {
$spreedConfig = $this->appConfig->getAllValues('spreed', filtered: true);
return json_encode($spreedConfig, JSON_PRETTY_PRINT) . PHP_EOL;
}
private function getTalkComponentVersion(string $url): string {
$url = rtrim($url, '/');
if (strpos($url, 'wss://') === 0) {
$url = 'https://' . substr($url, 6);
}
if (strpos($url, 'ws://') === 0) {
$url = 'http://' . substr($url, 5);
}
$client = $this->clientService->newClient();
try {
$response = $client->get($url . '/api/v1/welcome', [
'verify' => false,
'nextcloud' => [
'allow_local_address' => true,
],
]);
$body = $response->getBody();
$data = json_decode($body, true);
if (!is_array($data) || !isset($data['version'])) {
return 'error';
}
return (string)$data['version'];
} catch (\Exception $e) {
return 'error: ' . $e->getMessage();
}
}
}