Skip to content

Commit 8db3e47

Browse files
authored
Merge pull request #4 from GameServerTracker/beta
[ADD] New entrypoint: /fivem/info
2 parents 46b88b2 + c279fac commit 8db3e47

File tree

4 files changed

+113
-1
lines changed

4 files changed

+113
-1
lines changed

src/fivem/fivem.controller.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
55
import { Cache } from 'cache-manager';
66
import ServerTrackedDto from 'src/dto/serverTrackedDto';
77
import ServerCfxDto from 'src/dto/serverCfxDto';
8-
import { fivemCfxResponse, fivemPlayersResponse, fivemResponse } from './fivem.schema';
8+
import { fivemCfxResponse, fivemInfoResponse, fivemPlayersResponse, fivemResponse } from './fivem.schema';
99
import { CACHE_MANAGER } from '@nestjs/cache-manager';
1010
import { CacheKeys } from 'src/utils/enums';
1111

1212
/*
1313
CODE CacheKey
1414
- FM : FiveM Track server by Address
15+
- FMI : FiveM Track server Info
1516
- FMCFX : FiveM Track server by CFX Code
1617
- FMP : FiveM Track Players
1718
*/
@@ -89,4 +90,26 @@ export class FivemController {
8990
this.cacheManager.set(`${CacheKeys.FiveMPlayers}:${address.address}`, result, 5 * 60 * 1000);
9091
return result;
9192
}
93+
94+
@Get('/info/:address')
95+
@ApiOperation({
96+
summary: "Track a FiveM Server's info",
97+
description: "Return a JSON response with information about the server",
98+
})
99+
@ApiOkResponse({
100+
description: 'Server information',
101+
schema: fivemInfoResponse
102+
})
103+
async getServerInfo(@Param() address: ServerTrackedDto): Promise<any> {
104+
const cache: any = await this.cacheManager.get(`${CacheKeys.FiveMInfo}:${address.address}`);
105+
let result: any;
106+
107+
if (cache)
108+
return cache;
109+
result = await this.service.trackInfo(address);
110+
result["cacheTime"] = Math.floor(Date.now() / 1000);
111+
result["cacheExpire"] = Math.floor(Date.now() / 1000) + (5 * 60);
112+
this.cacheManager.set(`${CacheKeys.FiveMInfo}:${address.address}`, result, 5 * 60 * 1000);
113+
return result;
114+
}
92115
}

src/fivem/fivem.schema.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,70 @@ const fivemCfxResponse: SchemaObject & Partial<ReferenceObject> = {
285285
}
286286
}
287287

288+
const fivemInfoResponse: SchemaObject & Partial<ReferenceObject> = {
289+
type: 'object',
290+
properties: {
291+
address: { type: 'string', description: "Server's address" },
292+
online: { type: 'boolean', description: "Server's status. If the bool is true, the server is online" },
293+
cacheTime: { type: 'number', description: "UNIX timestamp when the response was cached" },
294+
cacheExpire: { type: 'number', description: "UNIX timestamp when the response will be remove from cache. Around 5 minutes." },
295+
enhancedHostSupport: { type: 'boolean', description: "Enhanced host support", nullable: true },
296+
icon: { type: 'string', description: "Server's icon in base64 format", nullable: true },
297+
resources: {
298+
type: 'array',
299+
description: "List of resources used by the server",
300+
nullable: true,
301+
items: { type: 'string' }
302+
},
303+
server: { type: 'string', nullable: true, description: "Server's software" },
304+
version: { type: 'number', nullable: true, description: "Server's version" },
305+
vars: {
306+
type: 'object',
307+
description: "Server's variables",
308+
nullable: true,
309+
properties: {
310+
sv_disableClientReplays: { type: 'boolean', nullable: true },
311+
sv_enforceGameBuild: { type: 'number', nullable: true },
312+
sv_enhancedHostSupport: { type: 'boolean', nullable: true },
313+
sv_lan: { type: 'boolean', nullable: true },
314+
sv_licenseKeyToken: { type: 'string', nullable: true },
315+
sv_maxClients: { type: 'number', nullable: true },
316+
sv_poolSizesIncrease: { type: 'string', nullable: true },
317+
sv_projectDesc: { type: 'string', nullable: true },
318+
sv_projectName: { type: 'string', nullable: true },
319+
sv_pureLevel: { type: 'number', nullable: true },
320+
sv_replaceExeToSwitchBuilds: { type: 'boolean', nullable: true },
321+
sv_scriptHookAllowed: { type: 'boolean', nullable: true },
322+
}
323+
}
324+
},
325+
example: {
326+
enhancedHostSupport: true,
327+
icon: "data:image/png;base64,...",
328+
requestSteamTicket: "off",
329+
resources: ["hardcap", "_cfx_internal", "mapmanager"],
330+
server: "FXServer-master SERVER v1.0.0.6228 win32",
331+
version: 123,
332+
vars: {
333+
sv_disableClientReplays: true,
334+
sv_enforceGameBuild: 2802,
335+
sv_enhancedHostSupport: true,
336+
sv_lan: false,
337+
sv_licenseKeyToken: "abcdef123456",
338+
sv_maxClients: 32,
339+
sv_poolSizesIncrease: "2048",
340+
sv_projectDesc: "My FiveM server",
341+
sv_projectName: "My FiveM server description",
342+
sv_pureLevel: 1,
343+
sv_replaceExeToSwitchBuilds: false,
344+
sv_scriptHookAllowed: false
345+
}
346+
}
347+
};
348+
288349
export {
289350
fivemResponse,
351+
fivemInfoResponse,
290352
fivemPlayersResponse,
291353
fivemCfxResponse
292354
};

src/fivem/fivem.service.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,32 @@ export class FivemService {
3333
}
3434
}
3535

36+
async trackInfo(serverTracked: ServerTrackedDto): Promise<any> {
37+
try {
38+
const response: Response = await fetch(
39+
`http://${serverTracked.address}/info.json`,
40+
{
41+
method: 'GET',
42+
signal: AbortSignal.timeout(2000),
43+
}
44+
)
45+
const data = await response.json();
46+
return {
47+
address: serverTracked.address,
48+
online: true,
49+
...data,
50+
};
51+
} catch (err: any) {
52+
Logger.warn(
53+
`[FiveM server | ${serverTracked.address}] ${err.name}: ${err.message}`,
54+
);
55+
return {
56+
address: serverTracked.address,
57+
online: false,
58+
};
59+
}
60+
}
61+
3662
async trackServerByCfx(cfx: ServerCfxDto): Promise<any> {
3763
try {
3864
let response: Response = await fetch(

src/utils/enums.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ enum CacheKeys {
2424
FiveM = "FM",
2525
FiveMCfxCode = "FMCFX",
2626
FiveMPlayers = "FMP",
27+
FiveMInfo = "FMI",
2728
Minecraft = "MC",
2829
MinecraftQuery = "MCQ",
2930
MinecraftBedrock = "MCB",

0 commit comments

Comments
 (0)