diff --git a/src/extendedPlayerProfile.ts b/src/extendedPlayerProfile.ts index 2a05c1d..9da1168 100644 --- a/src/extendedPlayerProfile.ts +++ b/src/extendedPlayerProfile.ts @@ -1,6 +1,12 @@ // Extended player profile -import { ListResult, Player, TribeChange, TWHelpClient } from './lib/client'; +import { + Ennoblement, + ListResult, + Player, + TribeChange, + TWHelpClient, +} from './lib/client'; import { DialogTable } from './common/DialogTable'; const SCREEN = 'info_player'; @@ -19,6 +25,12 @@ const translations: Record> = { 'Old tribe': 'Stare plemię', 'New tribe': 'Nowe plemię', 'Date/time': 'Data/czas', + Village: 'Wioska', + 'Old owner': 'Stary właściciel', + 'New owner': 'Nowy właściciel', + Points: 'Punkty', + Barbarian: 'Barbarzyńska', + Unknown: 'Nieznany', }, }; @@ -38,21 +50,37 @@ class TWHelpConnector { return this.client.player(this.version, this.server, this.id); } - tribeChanges(page: number, limit: number) { - return this.client.tribeChanges(this.version, this.server, this.id, { + playerTribeChanges(page: number, limit: number) { + return this.client.playerTribeChanges(this.version, this.server, this.id, { offset: (page - 1) * limit, limit: limit, sort: ['createdAt:desc', 'id:asc'], }); } + + playerEnnoblements(page: number, limit: number) { + return this.client.playerEnnoblements(this.version, this.server, this.id, { + offset: (page - 1) * limit, + limit: limit, + sort: ['createdAt:desc'], + }); + } } enum DialogId { TRIBE_CHANGES = 'kichiyaki_tribe_changes', + ENNOBLEMENTS = 'kichiyaki_ennoblements', } interface UIConnector { - tribeChanges(page: number, limit: number): Promise>; + playerTribeChanges( + page: number, + limit: number + ): Promise>; + playerEnnoblements( + page: number, + limit: number + ): Promise>; } class UI { @@ -165,7 +193,7 @@ class UI { ], 30, (page: number, limit: number) => { - return this.connector.tribeChanges(page, limit); + return this.connector.playerTribeChanges(page, limit); } ).render(); } @@ -174,8 +202,53 @@ class UI { e.preventDefault(); } - private showEnnoblements(e: Event) { + private async showEnnoblements(e: Event) { e.preventDefault(); + + await new DialogTable( + DialogId.ENNOBLEMENTS, + [ + { + header: t('Village'), + accessor: (e) => + `${e.village.fullName}`, + }, + { + header: t('Points'), + accessor: (e) => e.points.toLocaleString(), + }, + { + header: t('Old owner'), + accessor: (e) => + e.oldOwner + ? `${e.oldOwner.name}${ + e.oldOwner.tribe + ? ` (${e.oldOwner.tribe.tag})` + : '' + }` + : t('Barbarian'), + }, + { + header: t('New owner'), + accessor: (e) => + e.newOwner + ? `${e.newOwner.name}${ + e.newOwner.tribe + ? ` (${e.newOwner.tribe.tag})` + : '' + }` + : t('Unknown'), + }, + { + header: t('Date/time'), + accessor: (e) => new Date(e.createdAt).toLocaleString(), + }, + ], + 30, + (page: number, limit: number) => { + return this.connector.playerEnnoblements(page, limit); + } + ).render(); } } diff --git a/src/lib/client.ts b/src/lib/client.ts index 571bd32..520f00a 100644 --- a/src/lib/client.ts +++ b/src/lib/client.ts @@ -36,6 +36,15 @@ export type PlayerMeta = { tribe: TribeMeta | null; }; +export type VillageMeta = { + id: number; + fullName: string; + profileUrl: string; + x: number; + y: number; + continent: string; +}; + export type TribeChange = { id: number; newTribe: TribeMeta | null; @@ -43,6 +52,15 @@ export type TribeChange = { createdAt: string; }; +export type Ennoblement = { + id: number; + points: number; + newOwner: PlayerMeta | null; + oldOwner: PlayerMeta | null; + village: VillageMeta; + createdAt: string; +}; + export type ListResult = { data: T[]; total: number; @@ -54,6 +72,12 @@ export type ListTribeChangesQueryParams = { sort?: string[]; }; +export type ListEnnoblementsParams = { + offset?: number; + limit?: number; + sort?: string[]; +}; + export type TWHelpClientOptions = { timeout?: number; }; @@ -87,7 +111,7 @@ export class TWHelpClient { return resp.data.data; } - public async tribeChanges( + public async playerTribeChanges( version: string, server: string, id: number, @@ -117,4 +141,35 @@ export class TWHelpClient { total: parseInt(resp.headers[X_TOTAL_COUNT_HEADER] ?? '0'), }; } + + public async playerEnnoblements( + version: string, + server: string, + id: number, + queryParams?: ListEnnoblementsParams + ): Promise> { + 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}/ennoblements?${params.toString()}` + ); + return { + data: resp.data.data, + total: parseInt(resp.headers[X_TOTAL_COUNT_HEADER] ?? '0'), + }; + } }