mcp.conf
1 year ago
mcp.js
1 year ago
mcp.md
1 year ago
mcp.php
1 year ago
mcp_core.php
1 year ago
mcp_rest.php
1 year ago
oauth.php
1 year ago
realtime.php
1 year ago
realtime.php
125 lines
| 1 | <?php |
| 2 | //require_once(dirname(__FILE__) . '/../../../wp-load.php'); |
| 3 | |
| 4 | $wpLoad = dirname(__FILE__) . 'wp-load.php'; |
| 5 | echo $wpLoad; |
| 6 | require_once(dirname(__FILE__) . './wp-load.php'); |
| 7 | |
| 8 | // WebSocket server settings |
| 9 | $host = '0.0.0.0'; // Bind to all IPs (adjust as necessary) |
| 10 | $port = 8080; // Port for WebSocket server (adjust as necessary) |
| 11 | |
| 12 | // Create a WebSocket server socket |
| 13 | $server = stream_socket_server("tcp://$host:$port", $errno, $errstr); |
| 14 | |
| 15 | if (!$server) { |
| 16 | die("Error creating server: $errstr ($errno)\n"); |
| 17 | } |
| 18 | |
| 19 | echo "WebSocket server started at $host:$port\n"; |
| 20 | |
| 21 | $clients = []; |
| 22 | |
| 23 | // Main loop to accept incoming WebSocket connections and handle messages |
| 24 | while (true) { |
| 25 | // Prepare an array of streams to check for new activity |
| 26 | $read = array_merge([$server], $clients); |
| 27 | $write = null; |
| 28 | $except = null; |
| 29 | |
| 30 | if (stream_select($read, $write, $except, null) > 0) { |
| 31 | // Check for new connections |
| 32 | if (in_array($server, $read)) { |
| 33 | $client = stream_socket_accept($server); |
| 34 | |
| 35 | if ($client) { |
| 36 | // Perform WebSocket handshake |
| 37 | $request = fread($client, 1024); |
| 38 | preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches); |
| 39 | $key = base64_encode(pack('H*', sha1($matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))); |
| 40 | |
| 41 | $handshakeResponse = |
| 42 | "HTTP/1.1 101 Switching Protocols\r\n" . |
| 43 | "Upgrade: websocket\r\n" . |
| 44 | "Connection: Upgrade\r\n" . |
| 45 | "Sec-WebSocket-Accept: $key\r\n\r\n"; |
| 46 | |
| 47 | fwrite($client, $handshakeResponse); |
| 48 | $clients[] = $client; |
| 49 | |
| 50 | echo "New client connected!\n"; |
| 51 | |
| 52 | // Send welcome message to the client |
| 53 | $site_name = get_bloginfo('name'); |
| 54 | $welcome_message = "Welcome to $site_name server"; |
| 55 | $response = encodeWebSocketData($welcome_message); |
| 56 | fwrite($client, $response); |
| 57 | } |
| 58 | |
| 59 | unset($read[array_search($server, $read)]); |
| 60 | } |
| 61 | |
| 62 | // Handle existing client messages |
| 63 | foreach ($read as $client) { |
| 64 | $data = fread($client, 1024); |
| 65 | |
| 66 | if (!$data) { |
| 67 | fclose($client); |
| 68 | unset($clients[array_search($client, $clients)]); |
| 69 | echo "Client disconnected.\n"; |
| 70 | continue; |
| 71 | } |
| 72 | |
| 73 | // Decode WebSocket message |
| 74 | $decodedData = decodeWebSocketData($data); |
| 75 | echo "Received: $decodedData\n"; |
| 76 | |
| 77 | // Echo back the message to the client |
| 78 | $response = encodeWebSocketData("Echo: $decodedData"); |
| 79 | fwrite($client, $response); |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | // Function to decode WebSocket frame |
| 85 | function decodeWebSocketData($data) { |
| 86 | $unmaskedPayload = ''; |
| 87 | $decodedData = unpack('H*', $data); |
| 88 | $bytes = $decodedData[1]; |
| 89 | |
| 90 | $mask = [ |
| 91 | hexdec(substr($bytes, 4, 2)), |
| 92 | hexdec(substr($bytes, 6, 2)), |
| 93 | hexdec(substr($bytes, 8, 2)), |
| 94 | hexdec(substr($bytes, 10, 2)) |
| 95 | ]; |
| 96 | |
| 97 | $data = substr($bytes, 12); |
| 98 | for ($i = 0; $i < strlen($data); $i += 2) { |
| 99 | $unmaskedPayload .= chr($mask[($i / 2) % 4] ^ hexdec(substr($data, $i, 2))); |
| 100 | } |
| 101 | |
| 102 | return $unmaskedPayload; |
| 103 | } |
| 104 | |
| 105 | // Function to encode WebSocket frame |
| 106 | function encodeWebSocketData($data) { |
| 107 | $frame = []; |
| 108 | $frame[0] = 129; |
| 109 | $length = strlen($data); |
| 110 | |
| 111 | if ($length <= 125) { |
| 112 | $frame[1] = $length; |
| 113 | } else if ($length >= 126 && $length <= 65535) { |
| 114 | $frame[1] = 126; |
| 115 | $frame[2] = ($length >> 8) & 255; |
| 116 | $frame[3] = $length & 255; |
| 117 | } |
| 118 | |
| 119 | for ($i = 0; $i < $length; $i++) { |
| 120 | $frame[] = ord($data[$i]); |
| 121 | } |
| 122 | |
| 123 | return call_user_func_array('pack', array_merge(['C*'], $frame)); |
| 124 | } |
| 125 |