scripts/src/lib/client.ts

121 lines
2.5 KiB
TypeScript

import axios, { AxiosInstance } from 'axios';
const DEFAULT_TIMEOUT = 10000;
const X_TOTAL_COUNT_HEADER = 'x-total-count';
export type Version = {
code: string;
host: string;
name: string;
timezone: string;
};
export type Player = {
id: number;
bestRank: number;
bestRankAt: string;
mostPoints: number;
mostPointsAt: string;
mostVillages: number;
mostVillagesAt: string;
lastActivityAt: string;
createdAt: string;
};
export type TribeMeta = {
id: number;
name: string;
tag: string;
profileUrl: string;
};
export type PlayerMeta = {
id: number;
name: string;
profileUrl: string;
tribe: TribeMeta | null;
};
export type TribeChange = {
id: number;
newTribe: TribeMeta | null;
player: PlayerMeta;
createdAt: string;
};
export type ListResult<T> = {
data: T[];
total: number;
};
export type ListTribeChangesQueryParams = {
offset?: number;
limit?: number;
sort?: string[];
};
export type TWHelpClientOptions = {
timeout?: number;
};
export class TWHelpClient {
client: AxiosInstance;
constructor(url: string, opts?: TWHelpClientOptions) {
this.client = axios.create({
baseURL: url,
timeout: opts?.timeout ?? DEFAULT_TIMEOUT,
});
}
public async versions(): Promise<ListResult<Version>> {
const resp = await this.client.get('/api/v1/versions');
return {
data: resp.data.data,
total: parseInt(resp.headers[X_TOTAL_COUNT_HEADER] ?? '0'),
};
}
public async player(
version: string,
server: string,
id: number
): Promise<Player> {
const resp = await this.client.get(
`/api/v1/versions/${version}/servers/${server}/players/${id}`
);
return resp.data.data;
}
public async tribeChanges(
version: string,
server: string,
id: number,
queryParams?: ListTribeChangesQueryParams
): Promise<ListResult<TribeChange>> {
const params = new URLSearchParams();
if (queryParams?.limit) {
params.set('limit', queryParams.limit.toString());
}
if (queryParams?.offset) {
params.set('offset', queryParams.offset.toString());
}
if (Array.isArray(queryParams?.sort)) {
queryParams?.sort.forEach((s) => {
params.append('sort', s);
});
}
const resp = await this.client.get(
`/api/v1/versions/${version}/servers/${server}/players/${id}/tribe-changes?${params.toString()}`
);
return {
data: resp.data.data,
total: parseInt(resp.headers[X_TOTAL_COUNT_HEADER] ?? '0'),
};
}
}