Introduce new skin uploading endpoints

This commit is contained in:
ErickSkrauch 2022-12-21 05:28:03 +01:00
parent f0bc064dbc
commit 56cc9aea22
No known key found for this signature in database
GPG Key ID: 669339FCBB30EE0E
3 changed files with 74 additions and 0 deletions

View File

@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Added ### Added
- [Profile Information](https://wiki.vg/Mojang_API#Profile_Information) endpoint. - [Profile Information](https://wiki.vg/Mojang_API#Profile_Information) endpoint.
- [Change skin](https://wiki.vg/Mojang_API#Change_Skin) endpoint.
- [Upload skin](https://wiki.vg/Mojang_API#Upload_Skin) endpoint.
## [0.2.1] - 2020-06-10 ## [0.2.1] - 2020-06-10
### Added ### Added

View File

@ -210,6 +210,7 @@ class Api {
* *
* @throws GuzzleException * @throws GuzzleException
* *
* @deprecated
* @url https://wiki.vg/Mojang_API#Upload_Skin * @url https://wiki.vg/Mojang_API#Upload_Skin
*/ */
public function uploadSkin(string $accessToken, string $accountUuid, $skinContents, bool $isSlim): void { public function uploadSkin(string $accessToken, string $accountUuid, $skinContents, bool $isSlim): void {
@ -573,6 +574,55 @@ class Api {
); );
} }
/**
* @param string $accessToken
* @param \Psr\Http\Message\StreamInterface|resource|string $skinContents
* @param bool $isSlim
*
* @throws GuzzleException
*
* @url https://wiki.vg/Mojang_API#Upload_Skin
*/
public function uploadSkinByFile(string $accessToken, $skinContents, bool $isSlim): void {
$this->getClient()->request('POST', 'https://api.minecraftservices.com/minecraft/profile/skins', [
RequestOptions::MULTIPART => [
[
'name' => 'file',
'contents' => $skinContents,
'filename' => 'char.png',
],
[
'name' => 'variant',
'contents' => $isSlim ? 'slim' : 'classic',
],
],
RequestOptions::HEADERS => [
'Authorization' => 'Bearer ' . $accessToken,
],
]);
}
/**
* @param string $accessToken
* @param string $skinUrl
* @param bool $isSlim
*
* @throws GuzzleException
*
* @url https://wiki.vg/Mojang_API#Change_Skin
*/
public function uploadSkinByUrl(string $accessToken, string $skinUrl, bool $isSlim): void {
$this->getClient()->request('POST', 'https://api.minecraftservices.com/minecraft/profile/skins', [
RequestOptions::JSON => [
'variant' => $isSlim ? 'slim' : 'classic',
'url' => $skinUrl,
],
RequestOptions::HEADERS => [
'Authorization' => 'Bearer ' . $accessToken,
],
]);
}
/** /**
* @return ClientInterface * @return ClientInterface
*/ */

View File

@ -778,6 +778,28 @@ class ApiTest extends TestCase {
$this->assertSame('Minecon2013', $result->getCapes()[0]->getAlias()); $this->assertSame('Minecon2013', $result->getCapes()[0]->getAlias());
} }
public function testUploadSkinByFile(): void {
$this->mockHandler->append(new Response(200));
$this->api->uploadSkinByFile('mock access token', 'skin contents', false);
/** @var \Psr\Http\Message\RequestInterface $request */
$request = $this->history[0]['request'];
$this->assertSame('Bearer mock access token', $request->getHeaderLine('Authorization'));
$this->assertStringContainsString('skin contents', (string)$request->getBody());
$this->assertStringContainsString('classic', (string)$request->getBody());
}
public function testUploadSkinByUrl(): void {
$this->mockHandler->append(new Response(200));
$this->api->uploadSkinByUrl('mock access token', 'https://example.com/skin.png', false);
/** @var \Psr\Http\Message\RequestInterface $request */
$request = $this->history[0]['request'];
$this->assertSame('Bearer mock access token', $request->getHeaderLine('Authorization'));
$this->assertSame('application/json', $request->getHeaderLine('Content-Type'));
$this->assertSame('{"variant":"classic","url":"https:\/\/example.com\/skin.png"}', (string)$request->getBody());
}
private function createResponse(int $statusCode, array $response): ResponseInterface { private function createResponse(int $statusCode, array $response): ResponseInterface {
return new Response($statusCode, ['content-type' => 'json'], json_encode($response)); return new Response($statusCode, ['content-type' => 'json'], json_encode($response));
} }