/home/arranoyd/energyclinic/wp-content/plugins/ai-engine/labs/realtime.php
<?php
//require_once(dirname(__FILE__) . '/../../../wp-load.php');

$wpLoad = dirname(__FILE__) . 'wp-load.php';
echo $wpLoad;
require_once(dirname(__FILE__) . './wp-load.php');

// WebSocket server settings
$host = '0.0.0.0'; // Bind to all IPs (adjust as necessary)
$port = 8080;       // Port for WebSocket server (adjust as necessary)

// Create a WebSocket server socket
$server = stream_socket_server("tcp://$host:$port", $errno, $errstr);

if (!$server) {
  die("Error creating server: $errstr ($errno)\n");
}

echo "WebSocket server started at $host:$port\n";

$clients = [];

// Main loop to accept incoming WebSocket connections and handle messages
while (true) {
  // Prepare an array of streams to check for new activity
  $read = array_merge([$server], $clients);
  $write = null;
  $except = null;

  if (stream_select($read, $write, $except, null) > 0) {
    // Check for new connections
    if (in_array($server, $read)) {
      $client = stream_socket_accept($server);

      if ($client) {
        // Perform WebSocket handshake
        $request = fread($client, 1024);
        preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches);
        $key = base64_encode(pack('H*', sha1($matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
        
        $handshakeResponse = 
          "HTTP/1.1 101 Switching Protocols\r\n" .
          "Upgrade: websocket\r\n" .
          "Connection: Upgrade\r\n" .
          "Sec-WebSocket-Accept: $key\r\n\r\n";
        
        fwrite($client, $handshakeResponse);
        $clients[] = $client;

        echo "New client connected!\n";

        // Send welcome message to the client
        $site_name = get_bloginfo('name');
        $welcome_message = "Welcome to $site_name server";
        $response = encodeWebSocketData($welcome_message);
        fwrite($client, $response);
      }

      unset($read[array_search($server, $read)]);
    }

    // Handle existing client messages
    foreach ($read as $client) {
      $data = fread($client, 1024);
      
      if (!$data) {
        fclose($client);
        unset($clients[array_search($client, $clients)]);
        echo "Client disconnected.\n";
        continue;
      }

      // Decode WebSocket message
      $decodedData = decodeWebSocketData($data);
      echo "Received: $decodedData\n";

      // Echo back the message to the client
      $response = encodeWebSocketData("Echo: $decodedData");
      fwrite($client, $response);
    }
  }
}

// Function to decode WebSocket frame
function decodeWebSocketData($data) {
  $unmaskedPayload = '';
  $decodedData = unpack('H*', $data);
  $bytes = $decodedData[1];

  $mask = [
    hexdec(substr($bytes, 4, 2)),
    hexdec(substr($bytes, 6, 2)),
    hexdec(substr($bytes, 8, 2)),
    hexdec(substr($bytes, 10, 2))
  ];

  $data = substr($bytes, 12);
  for ($i = 0; $i < strlen($data); $i += 2) {
    $unmaskedPayload .= chr($mask[($i / 2) % 4] ^ hexdec(substr($data, $i, 2)));
  }

  return $unmaskedPayload;
}

// Function to encode WebSocket frame
function encodeWebSocketData($data) {
  $frame = [];
  $frame[0] = 129;
  $length = strlen($data);

  if ($length <= 125) {
    $frame[1] = $length;
  } else if ($length >= 126 && $length <= 65535) {
    $frame[1] = 126;
    $frame[2] = ($length >> 8) & 255;
    $frame[3] = $length & 255;
  }

  for ($i = 0; $i < $length; $i++) {
    $frame[] = ord($data[$i]);
  }

  return call_user_func_array('pack', array_merge(['C*'], $frame));
}