Add simple OpenSimulator RestConsole client
							parent
							
								
									80db5f35d1
								
							
						
					
					
						commit
						e6ba73430b
					
				|  | @ -0,0 +1,124 @@ | |||
| <?php | ||||
| declare(strict_types=1); | ||||
| 
 | ||||
| namespace Mcp\Opensim; | ||||
| 
 | ||||
| use XMLReader; | ||||
| 
 | ||||
| class RestConsole | ||||
| { | ||||
|     private string $baseUrl; | ||||
|     private ?string $sessionId; | ||||
| 
 | ||||
|     public function __construct(string $host, int $port) | ||||
|     { | ||||
|         $this->baseUrl = "http://".$host.':'.$port; | ||||
|     } | ||||
| 
 | ||||
|     public function startSession(string $username, string $password): bool | ||||
|     { | ||||
|         $response = $this->sendRequest('/StartSession/', [ | ||||
|             'USER' => $username, | ||||
|             'PASS' => $password | ||||
|         ]); | ||||
| 
 | ||||
|         if ($this->detectError($response, '/StartSession/')) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         $this->sessionId = $response['SessionID']; | ||||
|         $this->readResponses(); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     public function readResponses(): array | ||||
|     { | ||||
|         if ($this->sessionId == null) { | ||||
|             return array(); | ||||
|         } | ||||
| 
 | ||||
|         $response = $this->sendRequest('/ReadResponses/'.$this->sessionId); | ||||
|         if ($this->detectError($response, '/ReadResponses/')) { | ||||
|             return array(); | ||||
|         } | ||||
| 
 | ||||
|         return $response['Line']; | ||||
|     } | ||||
| 
 | ||||
|     public function sendCommand(string $command): bool | ||||
|     { | ||||
|         $response = $this->sendRequest('/SessionCommand/', [ | ||||
|             'ID' => $this->sessionId, | ||||
|             'COMMAND' => $command | ||||
|         ]); | ||||
| 
 | ||||
|         if ($this->detectError($response, '/SessionCommand/')) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return $response['Result'] == 'OK'; | ||||
|     } | ||||
| 
 | ||||
|     private function detectError(array|int $response, string $request): bool | ||||
|     { | ||||
|         if (gettype($response) == 'integer') { | ||||
|             error_log('OS RestConsole request '.$this->baseUrl.$request.' failed, status: '.$response); | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     private function sendRequest(string $request, array $data = array()): array|int | ||||
|     { | ||||
|         $curl = curl_init($this->baseUrl.$request); | ||||
|         curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | ||||
|         curl_setopt($curl, CURLOPT_POST, true); | ||||
|         curl_setopt($curl, CURLOPT_USERAGENT, 'mcp-restconsole/0.0.1'); | ||||
|         curl_setopt($curl, CURLOPT_HTTPHEADER, [ | ||||
|             'Accept' => 'text/xml' | ||||
|         ]); | ||||
| 
 | ||||
|         $postData = ''; | ||||
|         foreach ($data as $key => $val) { | ||||
|             $postData = $postData.(strlen($postData) > 0 ? '&' : '').$key.'='.$val; | ||||
|         } | ||||
|         curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); | ||||
| 
 | ||||
|         $res = curl_exec($curl); | ||||
|         $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); | ||||
|         if ($status != 200) { | ||||
|             return $status; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         return $this->parseXml($res); | ||||
|     } | ||||
| 
 | ||||
|     private function parseXml(string $response): array | ||||
|     { | ||||
|         $xmlReader = XMLReader::XML($response, "UTF-8"); | ||||
|         $res = array(); | ||||
|         if ($xmlReader->next()) { | ||||
|             $consoleSession = $xmlReader->expand(); | ||||
|             if ($consoleSession->nodeName == 'ConsoleSession') { | ||||
|                 foreach ($consoleSession->childNodes as $childNode) { | ||||
|                     $name = $childNode->nodeName; | ||||
|                     if (isset($res[$name])) { | ||||
|                         if (gettype($res[$name]) == 'string') { | ||||
|                             $res[$name] = array($res[$name], $childNode->nodeValue); | ||||
|                         } | ||||
|                         else { | ||||
|                             $res[$name][] = $childNode->nodeValue; | ||||
|                         } | ||||
|                     } | ||||
|                     else { | ||||
|                         $res[$name] = $childNode->nodeValue; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return $res; | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Anonymous Contributor
						Anonymous Contributor