palworld-api 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/dist/index.d.ts +122 -0
- package/dist/index.js +97 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# palworld-api
|
|
2
|
+
|
|
3
|
+
TypeScript/Node.js client for the Palworld dedicated server REST API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install palworld-api
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { PalworldAPI } from "palworld-api";
|
|
15
|
+
|
|
16
|
+
const api = new PalworldAPI("http://localhost:8212", "admin password");
|
|
17
|
+
|
|
18
|
+
const info = await api.getServerInfo();
|
|
19
|
+
console.log(info);
|
|
20
|
+
|
|
21
|
+
const players = await api.getPlayerList();
|
|
22
|
+
console.log(players);
|
|
23
|
+
|
|
24
|
+
await api.makeAnnouncement("Server restarting in 5 minutes");
|
|
25
|
+
await api.kickPlayer("steam_0:12345", "Cheating");
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
All methods return either the parsed response data or an `{ error: string }`
|
|
29
|
+
object on failure — no exceptions are thrown.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const result = await api.getServerMetrics();
|
|
33
|
+
if ("error" in result) {
|
|
34
|
+
console.error(result.error);
|
|
35
|
+
} else {
|
|
36
|
+
console.log(result.serverfps);
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
|
|
42
|
+
- `getServerInfo()`
|
|
43
|
+
- `getPlayerList()`
|
|
44
|
+
- `getServerMetrics()`
|
|
45
|
+
- `getServerSettings()`
|
|
46
|
+
- `kickPlayer(userid, message)`
|
|
47
|
+
- `banPlayer(userid, message)`
|
|
48
|
+
- `unbanPlayer(userid)`
|
|
49
|
+
- `saveServerState()`
|
|
50
|
+
- `makeAnnouncement(message)`
|
|
51
|
+
- `shutdownServer(waittime, message)`
|
|
52
|
+
- `stopServer()`
|
|
53
|
+
|
|
54
|
+
## Development
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install
|
|
58
|
+
npm run build
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Testing
|
|
62
|
+
|
|
63
|
+
Live integration tests run against a real Palworld dedicated server. Edit
|
|
64
|
+
`test/index.test.ts` and set `SERVER_URL`, `USERNAME`, `PASSWORD`, and
|
|
65
|
+
`TEST_USER_ID` to match your server, then run:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npm test
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`shutdownServer` and `stopServer` tests are skipped by default since they take
|
|
72
|
+
the server offline. Remove `.skip` only when intentionally testing shutdown.
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT
|
|
77
|
+
|
|
78
|
+
## Author
|
|
79
|
+
|
|
80
|
+
[KJAyano](https://github.com/KJAyano)
|
|
81
|
+
|
|
82
|
+
Repository: [github.com/KJAyano/palworld-api](https://github.com/KJAyano/palworld-api)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
export interface ErrorResult {
|
|
2
|
+
error: string;
|
|
3
|
+
}
|
|
4
|
+
export type ApiResult<T> = T | ErrorResult;
|
|
5
|
+
export interface ServerInfo {
|
|
6
|
+
version: string;
|
|
7
|
+
servername: string;
|
|
8
|
+
description: string;
|
|
9
|
+
worldguid: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PlayerInfo {
|
|
12
|
+
name: string;
|
|
13
|
+
accountName: string;
|
|
14
|
+
playerId: string;
|
|
15
|
+
userId: string;
|
|
16
|
+
ip: string;
|
|
17
|
+
ping: number;
|
|
18
|
+
location_x: number;
|
|
19
|
+
location_y: number;
|
|
20
|
+
level: number;
|
|
21
|
+
building_count: number;
|
|
22
|
+
}
|
|
23
|
+
export interface PlayerListResponse {
|
|
24
|
+
players: PlayerInfo[];
|
|
25
|
+
}
|
|
26
|
+
export interface ServerMetrics {
|
|
27
|
+
serverfps: number;
|
|
28
|
+
currentplayernum: number;
|
|
29
|
+
serverframetime: number;
|
|
30
|
+
maxplayernum: number;
|
|
31
|
+
uptime: number;
|
|
32
|
+
basecampnum: number;
|
|
33
|
+
days: number;
|
|
34
|
+
}
|
|
35
|
+
export interface ServerSettings {
|
|
36
|
+
Difficulty: string;
|
|
37
|
+
DayTimeSpeedRate: number;
|
|
38
|
+
NightTimeSpeedRate: number;
|
|
39
|
+
ExpRate: number;
|
|
40
|
+
PalCaptureRate: number;
|
|
41
|
+
PalSpawnNumRate: number;
|
|
42
|
+
PalDamageRateAttack: number;
|
|
43
|
+
PalDamageRateDefense: number;
|
|
44
|
+
PlayerDamageRateAttack: number;
|
|
45
|
+
PlayerDamageRateDefense: number;
|
|
46
|
+
PlayerStomachDecreaceRate: number;
|
|
47
|
+
PlayerStaminaDecreaceRate: number;
|
|
48
|
+
PlayerAutoHPRegeneRate: number;
|
|
49
|
+
PlayerAutoHpRegeneRateInSleep: number;
|
|
50
|
+
PalStomachDecreaceRate: number;
|
|
51
|
+
PalStaminaDecreaceRate: number;
|
|
52
|
+
PalAutoHPRegeneRate: number;
|
|
53
|
+
PalAutoHpRegeneRateInSleep: number;
|
|
54
|
+
BuildObjectDamageRate: number;
|
|
55
|
+
BuildObjectDeteriorationDamageRate: number;
|
|
56
|
+
CollectionDropRate: number;
|
|
57
|
+
CollectionObjectHpRate: number;
|
|
58
|
+
CollectionObjectRespawnSpeedRate: number;
|
|
59
|
+
EnemyDropItemRate: number;
|
|
60
|
+
DeathPenalty: string;
|
|
61
|
+
bEnablePlayerToPlayerDamage: boolean;
|
|
62
|
+
bEnableFriendlyFire: boolean;
|
|
63
|
+
bEnableInvaderEnemy: boolean;
|
|
64
|
+
bActiveUNKO: boolean;
|
|
65
|
+
bEnableAimAssistPad: boolean;
|
|
66
|
+
bEnableAimAssistKeyboard: boolean;
|
|
67
|
+
DropItemMaxNum: number;
|
|
68
|
+
DropItemMaxNum_UNKO: number;
|
|
69
|
+
BaseCampMaxNum: number;
|
|
70
|
+
BaseCampWorkerMaxNum: number;
|
|
71
|
+
DropItemAliveMaxHours: number;
|
|
72
|
+
bAutoResetGuildNoOnlinePlayers: boolean;
|
|
73
|
+
AutoResetGuildTimeNoOnlinePlayers: number;
|
|
74
|
+
GuildPlayerMaxNum: number;
|
|
75
|
+
PalEggDefaultHatchingTime: number;
|
|
76
|
+
WorkSpeedRate: number;
|
|
77
|
+
bIsMultiplay: boolean;
|
|
78
|
+
bIsPvP: boolean;
|
|
79
|
+
bCanPickupOtherGuildDeathPenaltyDrop: boolean;
|
|
80
|
+
bEnableNonLoginPenalty: boolean;
|
|
81
|
+
bEnableFastTravel: boolean;
|
|
82
|
+
bIsStartLocationSelectByMap: boolean;
|
|
83
|
+
bExistPlayerAfterLogout: boolean;
|
|
84
|
+
bEnableDefenseOtherGuildPlayer: boolean;
|
|
85
|
+
CoopPlayerMaxNum: number;
|
|
86
|
+
ServerPlayerMaxNum: number;
|
|
87
|
+
ServerName: string;
|
|
88
|
+
ServerDescription: string;
|
|
89
|
+
PublicPort: number;
|
|
90
|
+
PublicIP: string;
|
|
91
|
+
RCONEnabled: boolean;
|
|
92
|
+
RCONPort: number;
|
|
93
|
+
Region: string;
|
|
94
|
+
bUseAuth: boolean;
|
|
95
|
+
BanListURL: string;
|
|
96
|
+
RESTAPIEnabled: boolean;
|
|
97
|
+
RESTAPIPort: number;
|
|
98
|
+
bShowPlayerList: boolean;
|
|
99
|
+
AllowConnectPlatform: string;
|
|
100
|
+
bIsUseBackupSaveData: boolean;
|
|
101
|
+
LogFormatType: string;
|
|
102
|
+
}
|
|
103
|
+
export declare class PalworldAPI {
|
|
104
|
+
private serverUrl;
|
|
105
|
+
private client;
|
|
106
|
+
constructor(serverUrl: string, password: string, username?: string, timeoutMs?: number);
|
|
107
|
+
private toErrorResult;
|
|
108
|
+
fetch<T>(endpoint: string): Promise<ApiResult<T>>;
|
|
109
|
+
post<T>(endpoint: string, payload?: Record<string, unknown>): Promise<ApiResult<T>>;
|
|
110
|
+
getServerInfo(): Promise<ApiResult<ServerInfo>>;
|
|
111
|
+
getPlayerList(): Promise<ApiResult<PlayerListResponse>>;
|
|
112
|
+
getServerMetrics(): Promise<ApiResult<ServerMetrics>>;
|
|
113
|
+
getServerSettings(): Promise<ApiResult<ServerSettings>>;
|
|
114
|
+
kickPlayer(userid: string, message: string): Promise<ApiResult<unknown>>;
|
|
115
|
+
banPlayer(userid: string, message: string): Promise<ApiResult<unknown>>;
|
|
116
|
+
unbanPlayer(userid: string): Promise<ApiResult<unknown>>;
|
|
117
|
+
saveServerState(): Promise<ApiResult<unknown>>;
|
|
118
|
+
makeAnnouncement(message: string): Promise<ApiResult<unknown>>;
|
|
119
|
+
shutdownServer(waittime: number, message: string): Promise<ApiResult<unknown>>;
|
|
120
|
+
stopServer(): Promise<ApiResult<unknown>>;
|
|
121
|
+
}
|
|
122
|
+
export default PalworldAPI;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PalworldAPI = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
class PalworldAPI {
|
|
9
|
+
constructor(serverUrl, password, username = "admin", timeoutMs) {
|
|
10
|
+
this.serverUrl = serverUrl;
|
|
11
|
+
const token = Buffer.from(`${username}:${password}`).toString("base64");
|
|
12
|
+
this.client = axios_1.default.create({
|
|
13
|
+
baseURL: serverUrl,
|
|
14
|
+
maxBodyLength: Infinity,
|
|
15
|
+
maxContentLength: Infinity,
|
|
16
|
+
timeout: timeoutMs,
|
|
17
|
+
headers: {
|
|
18
|
+
Accept: "application/json",
|
|
19
|
+
"Content-Type": "application/json",
|
|
20
|
+
Authorization: `Basic ${token}`,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
toErrorResult(error) {
|
|
25
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
26
|
+
const axiosError = error;
|
|
27
|
+
if (axiosError.code === "ECONNABORTED" || axiosError.code === "ETIMEDOUT") {
|
|
28
|
+
return { error: "Request timeout" };
|
|
29
|
+
}
|
|
30
|
+
if (axiosError.response) {
|
|
31
|
+
return {
|
|
32
|
+
error: `Client error ${axiosError.response.status}: ${axiosError.response.statusText}`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (axiosError.request) {
|
|
36
|
+
return { error: "Connection error" };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (error instanceof Error) {
|
|
40
|
+
return { error: error.message };
|
|
41
|
+
}
|
|
42
|
+
return { error: String(error) };
|
|
43
|
+
}
|
|
44
|
+
async fetch(endpoint) {
|
|
45
|
+
try {
|
|
46
|
+
const response = await this.client.get(endpoint);
|
|
47
|
+
return response.data;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return this.toErrorResult(error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async post(endpoint, payload) {
|
|
54
|
+
try {
|
|
55
|
+
const response = await this.client.post(endpoint, payload ?? {});
|
|
56
|
+
return response.data;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return this.toErrorResult(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async getServerInfo() {
|
|
63
|
+
return this.fetch("/v1/api/info");
|
|
64
|
+
}
|
|
65
|
+
async getPlayerList() {
|
|
66
|
+
return this.fetch("/v1/api/players");
|
|
67
|
+
}
|
|
68
|
+
async getServerMetrics() {
|
|
69
|
+
return this.fetch("/v1/api/metrics");
|
|
70
|
+
}
|
|
71
|
+
async getServerSettings() {
|
|
72
|
+
return this.fetch("/v1/api/settings");
|
|
73
|
+
}
|
|
74
|
+
async kickPlayer(userid, message) {
|
|
75
|
+
return this.post("/v1/api/kick", { userid, message });
|
|
76
|
+
}
|
|
77
|
+
async banPlayer(userid, message) {
|
|
78
|
+
return this.post("/v1/api/ban", { userid, message });
|
|
79
|
+
}
|
|
80
|
+
async unbanPlayer(userid) {
|
|
81
|
+
return this.post("/v1/api/unban", { userid });
|
|
82
|
+
}
|
|
83
|
+
async saveServerState() {
|
|
84
|
+
return this.post("/v1/api/save");
|
|
85
|
+
}
|
|
86
|
+
async makeAnnouncement(message) {
|
|
87
|
+
return this.post("/v1/api/announce", { message });
|
|
88
|
+
}
|
|
89
|
+
async shutdownServer(waittime, message) {
|
|
90
|
+
return this.post("/v1/api/shutdown", { waittime, message });
|
|
91
|
+
}
|
|
92
|
+
async stopServer() {
|
|
93
|
+
return this.post("/v1/api/stop");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.PalworldAPI = PalworldAPI;
|
|
97
|
+
exports.default = PalworldAPI;
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "palworld-api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "TypeScript/Node.js client for the Palworld dedicated server REST API",
|
|
5
|
+
"author": "KJAyano",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/KJAyano/palworld-api.git"
|
|
9
|
+
},
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/KJAyano/palworld-api/issues"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/KJAyano/palworld-api#readme",
|
|
14
|
+
"main": "dist/index.js",
|
|
15
|
+
"types": "dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"test": "jest",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"palworld",
|
|
26
|
+
"rest-api",
|
|
27
|
+
"palworld restapi",
|
|
28
|
+
"pal-restapi"
|
|
29
|
+
],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"axios": "^1.7.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/jest": "^30.0.0",
|
|
36
|
+
"@types/node": "^25.9.3",
|
|
37
|
+
"jest": "^30.4.2",
|
|
38
|
+
"ts-jest": "^29.4.11",
|
|
39
|
+
"typescript": "^5.5.0"
|
|
40
|
+
}
|
|
41
|
+
}
|