Skip to content

Commit c573ba1

Browse files
committed
feat: add mapping userid <-> steamid
1 parent 0566609 commit c573ba1

8 files changed

Lines changed: 81 additions & 13 deletions

lib/handleSteamId.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* A20 introduces more platforms, which means player IDs can be a bit wonky.
3+
*/
4+
export function handleSteamId(data: Record<string, any> | Array<Record<string, any>>): Record<string, any> {
5+
6+
if (Array.isArray(data)) {
7+
return data.map(handleSteamId);
8+
}
9+
10+
if (data.players && Array.isArray(data.players)) {
11+
return {
12+
...data,
13+
players: data.players.map(handleSteamId)
14+
};
15+
}
16+
17+
const newData = { ...data };
18+
19+
if (data.userid && data.userid.includes('Steam_')) {
20+
newData.steamid = data.userid.replace('Steam_', '');
21+
newData.userid = data.userid;
22+
}
23+
24+
if (data.steamid && data.steamid.includes('Steam_')) {
25+
newData.steamid = newData.steamid.replace('Steam_', '');
26+
newData.userid = newData.steamid;
27+
}
28+
29+
return newData;
30+
}

lib/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import fetch, { RequestInit } from 'node-fetch';
22
import { stringify } from 'qs';
33
import { ParsedUrlQueryInput } from 'querystring';
44

5+
import { handleSteamId } from './handleSteamId';
56
import * as responses from './responses';
67

78
export interface SdtdServer {
@@ -43,7 +44,7 @@ async function fetchJson(server: SdtdServer, url: string, qs: ParsedUrlQueryInpu
4344
}).then(response => {
4445
const contentType = response.headers.get("content-type");
4546
if (contentType && contentType.indexOf("application/json") !== -1) {
46-
return response.json();
47+
return response.json().then(handleSteamId);
4748
} else {
4849
return response.text();
4950
}
@@ -82,7 +83,7 @@ export async function getPlayerInventory(server: SdtdServer, steamId: string, fe
8283
return fetchJson(server, `/api/getplayerinventory`, { adminuser: server.adminUser,admintoken: server.adminToken, steamid: steamId, userid: `Steam_${steamId}` }, fetchOpts);
8384
}
8485

85-
export async function getPlayerInventories(server: SdtdServer, fetchOpts?: RequestInit): Promise<responses.GetLog> {
86+
export async function getPlayerInventories(server: SdtdServer, fetchOpts?: RequestInit): Promise<Array<responses.InventoryResponse>> {
8687
return fetchJson(server, `/api/getplayerinventories`, { adminuser: server.adminUser,admintoken: server.adminToken }, fetchOpts);
8788
}
8889

lib/responses.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface Position {
1919

2020
export interface OnlinePlayerResponse {
2121
steamid: string,
22+
userid: string,
2223
entityid: number,
2324
ip: string,
2425
name: string,
@@ -72,6 +73,8 @@ export interface CommandEntry {
7273

7374
export interface InventoryResponse {
7475
playername: string,
76+
userid: string,
77+
steamid: string,
7578
bag: Array<any>, // eslint-disable-line
7679
belt: Array<any>, // eslint-disable-line
7780
equipment: PlayerEquipment
@@ -115,6 +118,7 @@ export interface PlayerNotOnline {
115118

116119
export interface PlayerLocation {
117120
steamid: string,
121+
userid: string,
118122
name: string,
119123
online: boolean,
120124
position: Position

test/getOnlinePlayers.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ describe('/api/getOnlinePlayers', async () => {
1717
const playerStats = response[0];
1818

1919
chai.expect(playerStats.steamid).to.be.a('string').and.to.be.not.empty;
20+
chai.expect(playerStats.steamid).to.not.contain('Steam_');
21+
chai.expect(playerStats.userid).to.be.a('string').and.to.be.not.empty;
2022
chai.expect(playerStats.name).to.be.a('string').and.to.be.not.empty;
2123
chai.expect(playerStats.entityid).to.be.a('number').and.to.be.not.equal(0);
2224
}

test/getPlayerInventories.test.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
'use strict';
2-
import g from './_globals';
32
import * as chai from 'chai';
4-
import { getPlayerInventories } from '../lib/index';
3+
4+
import { getPlayerInventories } from '../lib';
5+
import g from './_globals';
56

67
describe('/api/getPlayerInventories', async () => {
78
it('Returns expected info', async () => {
89
const response = await getPlayerInventories(g.getTestServer());
910
chai.expect(response).to.be.a('array');
11+
chai.expect(response).to.have.length(1);
12+
13+
for (const player of response) {
14+
chai.expect(player.playername).to.be.a('string');
15+
chai.expect(player.steamid).to.be.a('string');
16+
chai.expect(player.steamid).to.not.contain('Steam_');
17+
chai.expect(player.bag).to.be.a('array');
18+
chai.expect(player.belt).to.be.a('array');
19+
}
20+
21+
1022
});
1123
});

test/getPlayerInventory.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
'use strict';
2-
import g from './_globals';
32
import * as chai from 'chai';
4-
import { getPlayerInventory } from '../lib/index';
3+
4+
import { getPlayerInventory } from '../lib';
5+
import g from './_globals';
56

67
describe('/api/getPlayerInventory', async () => {
78
it('Returns a playername, bag, belt and equipment', async () => {
89
const response = await getPlayerInventory(g.getTestServer(), process.env.TESTPLAYER as string);
910
chai.expect(response.playername).to.be.a('string');
11+
chai.expect(response.steamid).to.be.a('string');
12+
chai.expect(response.steamid).to.not.contain('Steam_');
1013
chai.expect(response.bag).to.be.a('array');
1114
chai.expect(response.belt).to.be.a('array');
1215
});

test/getPlayerList.test.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
2-
import g from './_globals';
32
import * as chai from 'chai';
4-
import { getPlayerList } from '../lib/index';
3+
4+
import { getPlayerList } from '../lib';
5+
import g from './_globals';
56

67
describe('/api/getPlayerList', async () => {
78
it('Returns expected output', async () => {
@@ -10,6 +11,15 @@ describe('/api/getPlayerList', async () => {
1011
chai.expect(response.totalUnfiltered).to.be.a('number');
1112
chai.expect(response.firstResult).to.be.a('number');
1213
chai.expect(response.players).to.be.a('array');
14+
chai.expect(response.players).to.have.lengthOf(response.total);
15+
chai.expect(response.players).to.have.lengthOf(1);
16+
17+
for (const player of response.players) {
18+
chai.expect(player.name).to.be.a('string');
19+
chai.expect(player.steamid).to.be.a('string');
20+
chai.expect(player.steamid).to.not.contain('Steam_');
21+
}
22+
1323
});
1424
it('Limits response if rowsPerPage is given', async () => {
1525
const response = await getPlayerList(g.getTestServer(), 1);

test/getPlayersLocation.test.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
2-
import g from './_globals';
32
import * as chai from 'chai';
4-
import { getPlayersLocation } from '../lib/index';
3+
4+
import { getPlayersLocation } from '../lib';
5+
import g from './_globals';
56

67

78
describe('/api/getPlayersLocation', async () => {
@@ -13,8 +14,13 @@ describe('/api/getPlayersLocation', async () => {
1314
const response = await getPlayersLocation(g.getTestServer(), true);
1415
chai.expect(response).to.be.a('array');
1516
chai.expect(response).to.have.length.greaterThan(0);
16-
chai.expect(response[0].steamid).to.be.a("string");
17-
chai.expect(response[0].name).to.be.a("string");
18-
chai.expect(response[0].online).to.be.a("boolean");
17+
18+
for (const player of response) {
19+
chai.expect(player.steamid).to.be.a("string");
20+
chai.expect(player.steamid).to.not.contain('Steam_');
21+
chai.expect(player.userid).to.be.a("string");
22+
chai.expect(player.name).to.be.a("string");
23+
chai.expect(player.online).to.be.a("boolean");
24+
}
1925
});
2026
});

0 commit comments

Comments
 (0)