getRequest('GET', '/'); } public function getWhitelist(string $serverId): object { return $this->getRequest('GET', '/whitelist', ['server' => $serverId]); } public function addToWhitelist(string $serverId, array $userNames): object { return $this->postRequest('POST', '/whitelist', [ 'server' => $serverId, 'names' => json_encode($userNames), ]); } public function removeFromWhitelist(string $serverId, array $userNames): object { return $this->getRequest('DELETE', '/whitelist', [ 'server' => $serverId, 'names' => json_encode($userNames), ]); } public function createSignature(string $method, string $path, array $params, int $time = -1): string { if($time < 0) $time = time(); ksort($params); $compare = []; // other sides supports arrays, not gonna bother here foreach($params as $name => $value) $compare[] = "{$name}:{$value}"; $input = "{$time}%{$method} {$path}%" . implode('#', $compare); return Serialiser::uriBase64()->serialise( hash_hmac('sha256', $input, $this->secretKey, true) ); } public function getRequest(string $method, string $path, array $params = []): mixed { $time = time(); $sign = $this->createSignature($method, $path, $params, $time); $url = $this->endPoint . $path; if(!empty($params)) $url .= '?' . http_build_query($params); $request = curl_init($url); curl_setopt_array($request, [ CURLOPT_AUTOREFERER => false, CURLOPT_FAILONERROR => false, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_TCP_FASTOPEN => true, CURLOPT_CONNECTTIMEOUT => 2, CURLOPT_MAXREDIRS => 2, CURLOPT_PROTOCOLS => CURLPROTO_HTTPS, CURLOPT_TIMEOUT => 5, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_USERAGENT => 'mc.flashii.net', CURLOPT_HTTPHEADER => [ "X-Mince-Signature: {$sign}", "X-Mince-Timestamp: {$time}", ], ]); $response = curl_exec($request); curl_close($request); if(empty($response)) throw new RuntimeException('Empty response.'); $response = json_decode($response); if(!empty($response->error)) throw new RuntimeException($response->error); return $response; } public function postRequest(string $method, string $path, array $params): mixed { $time = time(); $sign = $this->createSignature($method, $path, $params, $time); $url = $this->endPoint . $path; $request = curl_init($url); curl_setopt_array($request, [ CURLOPT_AUTOREFERER => false, CURLOPT_FAILONERROR => false, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HEADER => false, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_TCP_FASTOPEN => true, CURLOPT_CONNECTTIMEOUT => 2, CURLOPT_MAXREDIRS => 2, CURLOPT_PROTOCOLS => CURLPROTO_HTTPS, CURLOPT_TIMEOUT => 5, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_USERAGENT => 'mc.flashii.net', CURLOPT_HTTPHEADER => [ "X-Mince-Signature: {$sign}", "X-Mince-Timestamp: {$time}", ], ]); $response = curl_exec($request); curl_close($request); if(empty($response)) throw new RuntimeException('Empty response.'); $response = json_decode($response); if(!empty($response->error)) throw new RuntimeException($response->error); return $response; } }