value('value'); $port = (int) (Setting::where('key', 'voip_socket_port')->value('value') ?: 0); $token = Setting::where('key', 'voip_socket_token')->value('value'); $timeout = (float) (Setting::where('key', 'voip_socket_timeout')->value('value') ?: 5); if (!$host || !$port) { return [ 'success' => false, 'provider_call_id' => null, 'message' => 'میزبان یا پورت سوکت تنظیم نشده است', 'status' => 'configuration_error', ]; } $connection = @stream_socket_client("tcp://{$host}:{$port}", $errorCode, $errorMessage, $timeout); if (!$connection) { return [ 'success' => false, 'provider_call_id' => null, 'message' => $errorMessage ?: 'اتصال سوکت برقرار نشد', 'status' => 'connection_failed', 'error_code' => $errorCode, ]; } stream_set_timeout($connection, (int) ceil($timeout)); $providerCallId = 'socket_' . uniqid(); $payload = [ 'type' => 'call.initiate', 'provider_call_id' => $providerCallId, 'phone' => $phone, 'caller_id' => $callerId, 'token' => $token, ]; fwrite($connection, json_encode($payload, JSON_UNESCAPED_UNICODE) . "\n"); $line = fgets($connection); fclose($connection); $response = $line ? json_decode($line, true) : []; return [ 'success' => ($response['success'] ?? true) === true, 'provider_call_id' => $response['provider_call_id'] ?? $providerCallId, 'message' => $response['message'] ?? 'درخواست تماس از راه سوکت ارسال شد', 'status' => $response['status'] ?? 'initiated', 'raw' => $response, ]; } public function getCallStatus(string $providerCallId): array { return [ 'status' => 'pending', 'provider_call_id' => $providerCallId, ]; } public function getRecordingUrl(string $providerCallId): ?string { $template = Setting::where('key', 'voip_socket_recording_url')->value('value'); return $template ? str_replace('{id}', $providerCallId, $template) : null; } public function testConnection(): array { $missing = []; foreach (['voip_socket_host', 'voip_socket_port'] as $key) { if (!Setting::where('key', $key)->value('value')) { $missing[] = $key; } } return [ 'ok' => $missing === [], 'message' => $missing ? 'تنظیمات اتصال سوکت کامل نیست.' : 'تنظیمات اتصال سوکت معتبر است.', 'missing' => $missing, ]; } }