> */ public function listConversations(): array { $credentials = $this->configService->getAutomationCredentials(); $username = trim($credentials['user']); $appPassword = trim($credentials['password']); if ($username === '' || $appPassword === '') { throw new \RuntimeException('Talk automation credentials are not configured.'); } $url = $this->urlGenerator->getAbsoluteURL('/ocs/v2.php/apps/spreed/api/v4/room?format=json&noStatusUpdate=1'); $client = $this->clientService->newClient(); try { $response = $client->get($url, [ 'timeout' => 20, 'auth' => [$username, $appPassword], 'headers' => [ 'Accept' => 'application/json', 'OCS-APIRequest' => 'true', ], ]); $decoded = json_decode((string)$response->getBody(), true, 512, JSON_THROW_ON_ERROR); } catch (\Throwable $e) { throw new \RuntimeException('Failed to fetch Talk conversations.', 0, $e); } if (!is_array($decoded)) { throw new \RuntimeException('Talk conversation response was not valid JSON.'); } $meta = $decoded['ocs']['meta'] ?? null; $data = $decoded['ocs']['data'] ?? null; if (!is_array($meta) || strtolower(trim((string)($meta['status'] ?? ''))) !== 'ok') { throw new \RuntimeException('Talk conversation response was not successful.'); } if (!is_array($data)) { return []; } $conversations = []; foreach ($data as $entry) { if (is_array($entry)) { $conversations[] = $entry; } } return $conversations; } /** @return array> */ public function listMessages(string $talkToken, int $lastKnownMessageId = 0): array { $credentials = $this->configService->getAutomationCredentials(); $username = trim($credentials['user']); $appPassword = trim($credentials['password']); if ($username === '' || $appPassword === '') { throw new \RuntimeException('Talk automation credentials are not configured.'); } $query = http_build_query([ 'format' => 'json', 'lookIntoFuture' => 0, 'limit' => 200, 'lastKnownMessageId' => max(0, $lastKnownMessageId), 'setReadMarker' => 0, 'noStatusUpdate' => 1, 'markNotificationsAsRead' => 0, ], '', '&', PHP_QUERY_RFC3986); $url = $this->urlGenerator->getAbsoluteURL('/ocs/v2.php/apps/spreed/api/v1/chat/' . rawurlencode($talkToken) . '?' . $query); $client = $this->clientService->newClient(); try { $response = $client->get($url, [ 'timeout' => 20, 'auth' => [$username, $appPassword], 'headers' => [ 'Accept' => 'application/json', 'OCS-APIRequest' => 'true', ], ]); $decoded = json_decode((string)$response->getBody(), true, 512, JSON_THROW_ON_ERROR); } catch (\Throwable $e) { throw new \RuntimeException('Failed to fetch Talk messages.', 0, $e); } if (!is_array($decoded)) { throw new \RuntimeException('Talk message response was not valid JSON.'); } $meta = $decoded['ocs']['meta'] ?? null; $data = $decoded['ocs']['data'] ?? null; if (!is_array($meta) || strtolower(trim((string)($meta['status'] ?? ''))) !== 'ok') { throw new \RuntimeException('Talk message response was not successful.'); } if (!is_array($data)) { return []; } $messages = []; foreach ($data as $entry) { if (is_array($entry)) { $messages[] = $entry; } } return $messages; } }