pokerogue/src/plugins/api/pokerogue-account-api.ts
2025-06-15 13:58:53 -05:00

115 lines
3.3 KiB
TypeScript

import type {
AccountInfoResponse,
AccountLoginRequest,
AccountLoginResponse,
AccountRegisterRequest,
AccountChangePwRequest,
} from "#app/@types/PokerogueAccountApi";
import { SESSION_ID_COOKIE_NAME } from "#app/constants";
import { ApiBase } from "#app/plugins/api/api-base";
import { removeCookie, setCookie } from "#app/utils/cookies";
/**
* A wrapper for PokéRogue account API requests.
*/
export class PokerogueAccountApi extends ApiBase {
//#region Public
/**
* Request the {@linkcode AccountInfoResponse | UserInfo} of the logged in user.
* The user is identified by the {@linkcode SESSION_ID_COOKIE_NAME | session cookie}.
*/
public async getInfo(): Promise<[data: AccountInfoResponse | null, status: number]> {
try {
const response = await this.doGet("/account/info");
if (response.ok) {
const resData = (await response.json()) as AccountInfoResponse;
return [resData, response.status];
}
console.warn("Could not get account info!", response.status, response.statusText);
return [null, response.status];
} catch (err) {
console.warn("Could not get account info!", err);
return [null, 500];
}
}
/**
* Register a new account.
* @param registerData The {@linkcode AccountRegisterRequest} to send
* @returns An error message if something went wrong
*/
public async register(registerData: AccountRegisterRequest) {
try {
const response = await this.doPost("/account/register", registerData, "form-urlencoded");
if (response.ok) {
return null;
}
return response.text();
} catch (err) {
console.warn("Register failed!", err);
}
return "Unknown error!";
}
/**
* Send a login request.
* Sets the session cookie on success.
* @param loginData The {@linkcode AccountLoginRequest} to send
* @returns An error message if something went wrong
*/
public async login(loginData: AccountLoginRequest) {
try {
const response = await this.doPost("/account/login", loginData, "form-urlencoded");
if (response.ok) {
const loginResponse = (await response.json()) as AccountLoginResponse;
setCookie(SESSION_ID_COOKIE_NAME, loginResponse.token);
return null;
}
console.warn("Login failed!", response.status, response.statusText);
return response.text();
} catch (err) {
console.warn("Login failed!", err);
}
return "Unknown error!";
}
/**
* Send a logout request.
* **Always** (no matter if failed or not) removes the session cookie.
*/
public async logout() {
try {
const response = await this.doGet("/account/logout");
if (!response.ok) {
throw new Error(`${response.status}: ${response.statusText}`);
}
} catch (err) {
console.warn("Log out failed!", err);
}
removeCookie(SESSION_ID_COOKIE_NAME); // we are always clearing the cookie.
}
public async changePassword(changePwData: AccountChangePwRequest) {
try {
const response = await this.doPost("/account/changepw", changePwData, "form-urlencoded");
if (response.ok) {
return null;
}
console.warn("Change password failed!", response.status, response.statusText);
return response.text();
} catch (err) {
console.warn("Change password failed!", err);
}
return "Unknown error!";
}
}