This commit is contained in:
Eden Kirin
2023-03-27 13:17:09 +02:00
parent d660e3a586
commit cf0605c83c
2 changed files with 167 additions and 0 deletions

124
javascript/fh_sdk.js Normal file
View File

@ -0,0 +1,124 @@
class PlayerNotFoundError extends Error {
constructor(message) {
if (!message) {
message = "Player not found";
}
super(message);
this.name = "PlayerNotFoundError";
}
}
class PlayerInactiveError extends Error {
constructor(message) {
if (!message) {
message = "Player kicked out due to inactivity";
}
super(message);
this.name = "PlayerInactiveError";
}
}
class PositionError extends Error {
constructor(message) {
if (!message) {
message = "Position out of bounds or collision with an object";
}
super(message);
this.name = "PositionError";
}
}
class FairHopper {
constructor(host, port) {
this.host = host;
this.port = port;
this.defaultHeaders = {
Accept: "application/json",
"Content-Type": "application/json",
};
}
formatUrl(path) {
return `${this.host}:${this.port}${path}`;
}
async ping() {
const r = await fetch(this.formatUrl("/ping"), {
headers: this.defaultHeaders,
});
return await r.json();
}
async startGame(playerName) {
const payload = {
player_name: playerName,
};
const r = await fetch(this.formatUrl("/game"), {
method: "post",
headers: this.defaultHeaders,
body: JSON.stringify(payload),
});
return await r.json();
}
async getGameInfo() {
const r = await fetch(this.formatUrl("/game"), {
headers: this.defaultHeaders,
});
return await r.json();
}
async getPlayerInfo(playerUuid) {
const r = await fetch(this.formatUrl(`/player/${playerUuid}`), {
headers: this.defaultHeaders,
});
switch (r.status) {
case 403:
throw new PlayerInactiveError();
case 404:
throw new PlayerNotFoundError();
}
return await r.json();
}
async moveLeft(playerUuid) {
return await this.move(playerUuid, "left");
}
async moveRight(playerUuid) {
return await this.move(playerUuid, "right");
}
async moveUp(playerUuid) {
return await this.move(playerUuid, "up");
}
async moveDown(playerUuid) {
return await this.move(playerUuid, "down");
}
async move(playerUuid, direction) {
const url = this.formatUrl(`/player/${playerUuid}/move/${direction}`);
const r = await fetch(url, {
method: "post",
headers: this.defaultHeaders,
});
switch (r.status) {
case 403:
throw new PlayerInactiveError();
case 404:
throw new PlayerNotFoundError();
case 409:
throw new PositionError();
}
return await r.json();
}
}
module.exports = {
FairHopper,
PlayerNotFoundError,
PlayerInactiveError,
PositionError,
};