@shaunlwm/pickle.ts 1.11.0 → 1.12.1
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 +13 -10
- package/dist/index.d.ts +140 -7
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Type-safe client library for Club Penguin Private Servers.
|
|
4
4
|
|
|
5
|
-
Built with TypeScript, Socket.IO, and msgpack. Supports CPJourney, CPLegacy, NewCP, and PenguinOrigins through an adapter pattern.
|
|
5
|
+
Built with TypeScript, Socket.IO, and msgpack. Supports CPJourney, CPLegacy, CPPS.lol, NewCP, and PenguinOrigins through an adapter pattern.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -44,7 +44,7 @@ Creates a new client instance.
|
|
|
44
44
|
|
|
45
45
|
| Param | Type | Description |
|
|
46
46
|
|---|---|---|
|
|
47
|
-
| `server` | `"CPJourney" \| "CPLegacy" \| "NewCP" \| "PenguinOrigins"` | CPPS server identifier (strongly typed) |
|
|
47
|
+
| `server` | `"CPJourney" \| "CPLegacy" \| "CPPSlol" \| "NewCP" \| "PenguinOrigins"` | CPPS server identifier (strongly typed) |
|
|
48
48
|
| `options.debug` | `boolean \| LogFn` | Enable debug logging. Pass `true` for console.log, or a custom function |
|
|
49
49
|
| `options.connectionProfile` | `"chrome" \| "node" \| ConnectionProfile` | Controls HTTP/WebSocket headers. Defaults to browser-like Chrome headers; use `"node"` to preserve Node defaults |
|
|
50
50
|
|
|
@@ -84,7 +84,8 @@ const servers = await client.login({
|
|
|
84
84
|
timeoutMs: 20_000,
|
|
85
85
|
signal: abortController.signal,
|
|
86
86
|
})
|
|
87
|
-
// servers: ServerInfo[] = [{ name: string, population: number }]
|
|
87
|
+
// servers: ServerInfo[] = [{ name: string, population: number, users?: number }]
|
|
88
|
+
// CPPS.lol: population is browser bars; users is the exact penguin count.
|
|
88
89
|
```
|
|
89
90
|
|
|
90
91
|
Also supports token-based login:
|
|
@@ -223,12 +224,14 @@ client.disconnect()
|
|
|
223
224
|
|
|
224
225
|
All events are fully typed via `ServerMessages`.
|
|
225
226
|
|
|
226
|
-
`ServerMessages` remains the compatibility aggregate.
|
|
227
|
-
contracts are also exported separately as `CpjourneyClientMessages
|
|
228
|
-
`CpjourneyServerMessages
|
|
229
|
-
|
|
230
|
-
`
|
|
231
|
-
|
|
227
|
+
`ServerMessages` remains the compatibility aggregate. Server-specific wire
|
|
228
|
+
contracts are also exported separately as `CpjourneyClientMessages`,
|
|
229
|
+
`CpjourneyServerMessages`, `CppslolClientMessages`, and
|
|
230
|
+
`CppslolServerMessages`. CPPS.lol-only operations are available through
|
|
231
|
+
`client.cppslol`; unsupported methods throw or reject with a non-retryable
|
|
232
|
+
`ClientOperationError` whose category is `unsupported_operation`. Shared
|
|
233
|
+
actions should be normalized by each adapter rather than assuming identical
|
|
234
|
+
wire payloads.
|
|
232
235
|
|
|
233
236
|
```typescript
|
|
234
237
|
client.on("send_message", ({ id, message }) => {
|
|
@@ -303,7 +306,7 @@ import type {
|
|
|
303
306
|
PlayerSettings, // game settings
|
|
304
307
|
Buddy, // buddy list entry
|
|
305
308
|
Mascot, // mascot data
|
|
306
|
-
ServerInfo, // server name + population
|
|
309
|
+
ServerInfo, // server name + population; CPPS.lol also includes users
|
|
307
310
|
LoginOptions, // username + password login
|
|
308
311
|
TokenLoginOptions,// username + token login
|
|
309
312
|
LoginResult, // login response (servers, key, username)
|
package/dist/index.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ type NormalizedConnectionProfile = {
|
|
|
25
25
|
type ServerInfo = {
|
|
26
26
|
name: string;
|
|
27
27
|
population: number;
|
|
28
|
+
/** CPPS.lol only: exact number of penguins online. */
|
|
29
|
+
users?: number;
|
|
28
30
|
};
|
|
29
31
|
type LoginOptions = {
|
|
30
32
|
username: string;
|
|
@@ -616,6 +618,53 @@ declare class CplegacyAdapter extends BaseAdapter {
|
|
|
616
618
|
protected createSocket(serverName: string): Socket;
|
|
617
619
|
}
|
|
618
620
|
|
|
621
|
+
declare class CppslolAdapter extends BaseAdapter {
|
|
622
|
+
readonly id = "CPPS.lol";
|
|
623
|
+
private signer;
|
|
624
|
+
private sessionToken;
|
|
625
|
+
login(options: LoginOptions | TokenLoginOptions, operationOptions?: ClientOperationOptions): Promise<LoginResult>;
|
|
626
|
+
connect(serverName: string, loginResult: LoginResult, options?: ConnectOptions): Promise<Socket>;
|
|
627
|
+
send(action: string, args: Record<string, unknown>): void;
|
|
628
|
+
disconnect(): void;
|
|
629
|
+
normalizeUser(raw: Record<string, unknown>): RoomUser;
|
|
630
|
+
normalizePlayer(raw: Record<string, unknown>): PlayerData;
|
|
631
|
+
sendMessage(message: string): void;
|
|
632
|
+
sendEmote(emote: number): void;
|
|
633
|
+
sendSafe(safe: number): void;
|
|
634
|
+
walk(x: number, y: number): void;
|
|
635
|
+
sendFrame(frame: number, set?: boolean): void;
|
|
636
|
+
snowball(x: number, y: number): void;
|
|
637
|
+
joinRoom(room: number, x?: number, y?: number): void;
|
|
638
|
+
addItem(item: number): void;
|
|
639
|
+
private updatePlayer;
|
|
640
|
+
equipColor(item: number): void;
|
|
641
|
+
equipHead(item: number): void;
|
|
642
|
+
equipFace(item: number): void;
|
|
643
|
+
equipNeck(item: number): void;
|
|
644
|
+
equipBody(item: number): void;
|
|
645
|
+
equipHand(item: number): void;
|
|
646
|
+
equipFeet(item: number): void;
|
|
647
|
+
equipFlag(item: number): void;
|
|
648
|
+
equipPhoto(item: number): void;
|
|
649
|
+
getIglooOpen(igloo: number): void;
|
|
650
|
+
joinIgloo(igloo: number, x?: number, y?: number): void;
|
|
651
|
+
updateIglooFurniture(furniture: IglooFurniturePlacement[]): void;
|
|
652
|
+
openIglooRaw(): void;
|
|
653
|
+
sendPackedEmote(pack: number, emote: number): void;
|
|
654
|
+
updateLayeredPlayer(item: number): void;
|
|
655
|
+
acceptMature(): void;
|
|
656
|
+
removeInventory(item: number): void;
|
|
657
|
+
getSnowflakeState(): void;
|
|
658
|
+
getPets(userId: number): void;
|
|
659
|
+
getIglooContest(): void;
|
|
660
|
+
getIglooLikesFor(iglooId: number): void;
|
|
661
|
+
likeIglooById(iglooId: number): void;
|
|
662
|
+
sendMail(recipient: number, postcardId: number): void;
|
|
663
|
+
marryRequest(id: number): void;
|
|
664
|
+
leaveWaddle(): void;
|
|
665
|
+
protected createSocket(path: string): Socket;
|
|
666
|
+
}
|
|
667
|
+
|
|
619
668
|
declare class NewcpAdapter extends BaseAdapter {
|
|
620
669
|
readonly id = "NewCP";
|
|
621
670
|
private encryptor;
|
|
@@ -691,6 +740,7 @@ declare class PenguinoriginsAdapter extends BaseAdapter {
|
|
|
691
740
|
}
|
|
692
741
|
|
|
693
742
|
declare const ADAPTERS: {
|
|
743
|
+
readonly CPPSlol: typeof CppslolAdapter;
|
|
694
744
|
readonly CPJourney: typeof CpjourneyAdapter;
|
|
695
745
|
readonly CPLegacy: typeof CplegacyAdapter;
|
|
696
746
|
readonly NewCP: typeof NewcpAdapter;
|
|
@@ -716,10 +766,11 @@ type ClientMessages = {
|
|
|
716
766
|
y?: number;
|
|
717
767
|
};
|
|
718
768
|
add_item: {
|
|
719
|
-
item: number;
|
|
769
|
+
item: number | string;
|
|
720
770
|
};
|
|
721
771
|
send_emote: {
|
|
722
772
|
emote: number;
|
|
773
|
+
pack?: number;
|
|
723
774
|
};
|
|
724
775
|
send_safe: {
|
|
725
776
|
safe: number;
|
|
@@ -772,7 +823,9 @@ type ClientMessages = {
|
|
|
772
823
|
userId: number;
|
|
773
824
|
isBackyard?: boolean;
|
|
774
825
|
};
|
|
775
|
-
get_igloo_likes:
|
|
826
|
+
get_igloo_likes: {
|
|
827
|
+
iglooId?: number;
|
|
828
|
+
};
|
|
776
829
|
join_igloo: {
|
|
777
830
|
igloo: number;
|
|
778
831
|
x?: number;
|
|
@@ -866,7 +919,9 @@ type ClientMessages = {
|
|
|
866
919
|
};
|
|
867
920
|
open_igloo: Record<string, never>;
|
|
868
921
|
close_igloo_bounds: Record<string, never>;
|
|
869
|
-
like_igloo:
|
|
922
|
+
like_igloo: {
|
|
923
|
+
iglooId?: number;
|
|
924
|
+
};
|
|
870
925
|
igloo_editor_open: Record<string, never>;
|
|
871
926
|
igloo_editor_closed: Record<string, never>;
|
|
872
927
|
tower_init: Record<string, never>;
|
|
@@ -895,6 +950,24 @@ type ClientMessages = {
|
|
|
895
950
|
join_waddle: {
|
|
896
951
|
waddle: number;
|
|
897
952
|
};
|
|
953
|
+
/** CPPS.lol-only packets. */
|
|
954
|
+
leave_waddle: Record<string, never>;
|
|
955
|
+
remove_inventory: {
|
|
956
|
+
item: number;
|
|
957
|
+
};
|
|
958
|
+
get_snowflake_state: Record<string, never>;
|
|
959
|
+
accept_mature: Record<string, never>;
|
|
960
|
+
get_pets: {
|
|
961
|
+
userId: number;
|
|
962
|
+
};
|
|
963
|
+
get_igloo_contest: Record<string, never>;
|
|
964
|
+
send_mail: {
|
|
965
|
+
recipient: number;
|
|
966
|
+
postcardId: number;
|
|
967
|
+
};
|
|
968
|
+
marry_request: {
|
|
969
|
+
id: number;
|
|
970
|
+
};
|
|
898
971
|
};
|
|
899
972
|
type ServerMessages = {
|
|
900
973
|
login: {
|
|
@@ -939,6 +1012,7 @@ type ServerMessages = {
|
|
|
939
1012
|
send_emote: {
|
|
940
1013
|
id: number;
|
|
941
1014
|
emote: number;
|
|
1015
|
+
pack?: number;
|
|
942
1016
|
};
|
|
943
1017
|
join_game_room: {
|
|
944
1018
|
game: number;
|
|
@@ -1030,8 +1104,10 @@ type ServerMessages = {
|
|
|
1030
1104
|
id: number;
|
|
1031
1105
|
};
|
|
1032
1106
|
add_item: {
|
|
1033
|
-
item: number;
|
|
1107
|
+
item: number | string;
|
|
1034
1108
|
coins: number;
|
|
1109
|
+
name?: string;
|
|
1110
|
+
slot?: string;
|
|
1035
1111
|
};
|
|
1036
1112
|
get_postcards: {
|
|
1037
1113
|
postcards: Postcard[];
|
|
@@ -1258,17 +1334,46 @@ type ServerMessages = {
|
|
|
1258
1334
|
uuid: string[];
|
|
1259
1335
|
message: string;
|
|
1260
1336
|
};
|
|
1337
|
+
/** CPPS.lol-only events. */
|
|
1338
|
+
remove_inventory: {
|
|
1339
|
+
id: number | string;
|
|
1340
|
+
};
|
|
1341
|
+
snowflake_state: {
|
|
1342
|
+
windowOpen: boolean;
|
|
1343
|
+
lifetimeMs: number;
|
|
1344
|
+
type: string | number | null;
|
|
1345
|
+
};
|
|
1346
|
+
get_pets: {
|
|
1347
|
+
userId?: number;
|
|
1348
|
+
pets: Puffle[];
|
|
1349
|
+
};
|
|
1350
|
+
igloo_contest: {
|
|
1351
|
+
active: boolean;
|
|
1352
|
+
};
|
|
1353
|
+
igloo_likes: {
|
|
1354
|
+
iglooId: number;
|
|
1355
|
+
likes: number;
|
|
1356
|
+
liked: boolean;
|
|
1357
|
+
created?: boolean | string;
|
|
1358
|
+
};
|
|
1359
|
+
marry_request: {
|
|
1360
|
+
id: number;
|
|
1361
|
+
};
|
|
1261
1362
|
};
|
|
1363
|
+
/** CPPS.lol-only commands captured from its signed Socket.IO protocol. */
|
|
1364
|
+
type CppslolClientMessages = Pick<ClientMessages, "leave_waddle" | "remove_inventory" | "get_snowflake_state" | "accept_mature" | "get_pets" | "get_igloo_contest" | "send_mail" | "marry_request">;
|
|
1365
|
+
/** CPPS.lol-only events captured from its signed Socket.IO protocol. */
|
|
1366
|
+
type CppslolServerMessages = Pick<ServerMessages, "remove_inventory" | "snowflake_state" | "get_pets" | "igloo_contest" | "igloo_likes" | "marry_request">;
|
|
1262
1367
|
/** CPJourney-only commands captured from its Socket.IO protocol. */
|
|
1263
1368
|
type CpjourneyClientMessages = Pick<ClientMessages, "get_puffles" | "adopt_puffle" | "check_puffle_sprite" | "get_all_puffles" | "get_wellbeing" | "puffle_play" | "update_puffle_rest" | "puffle_buy_item" | "walk_puffle" | "backyard_supplies" | "buddy_find" | "get_store_music" | "add_music" | "get_igloostore_items" | "add_furniture" | "update_music" | "update_furniture" | "update_furniture_auto" | "update_igloo" | "open_igloo" | "close_igloo_bounds" | "like_igloo" | "igloo_editor_open" | "igloo_editor_closed" | "tower_init">;
|
|
1264
1369
|
/** CPJourney-only events captured from its Socket.IO protocol. */
|
|
1265
1370
|
type CpjourneyServerMessages = Pick<ServerMessages, "game_over" | "get_postcards" | "join_igloo" | "get_puffles" | "adopt_puffle" | "get_all_puffles" | "get_wellbeing" | "get_walking_puffle" | "update_wellbeing" | "puffle_levelup" | "puffle_popup" | "buy_puffle_item" | "walk_puffle" | "backyard_supplies" | "buddy_find" | "receive_postcard" | "get_store_music" | "add_music" | "get_igloostore_items" | "add_furniture" | "update_music" | "igloo_open_status" | "igloo_bounds_status" | "igloo_liked">;
|
|
1266
1371
|
|
|
1267
|
-
type RequestFn = <K extends keyof ServerMessages>(event: K, send: () => void, options?: ClientOperationOptions, matches?: (args: ServerMessages[K]) => boolean) => Promise<ServerMessages[K]>;
|
|
1372
|
+
type RequestFn$1 = <K extends keyof ServerMessages>(event: K, send: () => void, options?: ClientOperationOptions, matches?: (args: ServerMessages[K]) => boolean) => Promise<ServerMessages[K]>;
|
|
1268
1373
|
declare class CardJitsu {
|
|
1269
1374
|
private adapter;
|
|
1270
1375
|
private request;
|
|
1271
|
-
constructor(adapter: BaseAdapter, request: RequestFn);
|
|
1376
|
+
constructor(adapter: BaseAdapter, request: RequestFn$1);
|
|
1272
1377
|
/** Fetch ninja rank, progress, and card deck. Resolves with ninja data. */
|
|
1273
1378
|
getNinja(options?: ClientOperationOptions): Promise<ServerMessages["get_ninja"]>;
|
|
1274
1379
|
/** Fetch state of all Dojo mats. Resolves with mat state. */
|
|
@@ -1287,6 +1392,32 @@ declare class CardJitsu {
|
|
|
1287
1392
|
loadAnimation(animation: string): void;
|
|
1288
1393
|
}
|
|
1289
1394
|
|
|
1395
|
+
type RequestFn = <K extends keyof ServerMessages>(event: K, send: () => void, options?: ClientOperationOptions, matches?: (args: ServerMessages[K]) => boolean) => Promise<ServerMessages[K]>;
|
|
1396
|
+
/** Operations implemented only by CPPS.lol's captured protocol. */
|
|
1397
|
+
declare class Cppslol {
|
|
1398
|
+
private readonly baseAdapter;
|
|
1399
|
+
private readonly request;
|
|
1400
|
+
constructor(baseAdapter: BaseAdapter, request: RequestFn);
|
|
1401
|
+
private get adapter();
|
|
1402
|
+
/** Send an emote from a CPPS.lol emote pack. */
|
|
1403
|
+
sendPackedEmote(pack: number, emote: number): void;
|
|
1404
|
+
/** Equip an item in CPPS.lol's additional appearance layer. */
|
|
1405
|
+
updateLayeredPlayer(item: number): void;
|
|
1406
|
+
/** Acknowledge the mature-server notice for the current session. */
|
|
1407
|
+
acceptMature(): void;
|
|
1408
|
+
removeInventory(item: number, options?: ClientOperationOptions): Promise<ServerMessages["remove_inventory"]>;
|
|
1409
|
+
getSnowflakeState(options?: ClientOperationOptions): Promise<ServerMessages["snowflake_state"]>;
|
|
1410
|
+
getPets(userId: number, options?: ClientOperationOptions): Promise<ServerMessages["get_pets"]>;
|
|
1411
|
+
getIglooContest(options?: ClientOperationOptions): Promise<ServerMessages["igloo_contest"]>;
|
|
1412
|
+
getIglooLikes(iglooId: number, options?: ClientOperationOptions): Promise<ServerMessages["igloo_likes"]>;
|
|
1413
|
+
likeIgloo(iglooId: number, options?: ClientOperationOptions): Promise<ServerMessages["igloo_likes"]>;
|
|
1414
|
+
/** CPPS.lol does not acknowledge this action with a dedicated response. */
|
|
1415
|
+
openIgloo(): void;
|
|
1416
|
+
sendMail(recipient: number, postcardId: number): void;
|
|
1417
|
+
marryRequest(id: number): void;
|
|
1418
|
+
leaveWaddle(): void;
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1290
1421
|
type ServerMessageHandler<K extends keyof ServerMessages> = (args: ServerMessages[K]) => void;
|
|
1291
1422
|
type LogFn = (message: string, ...args: unknown[]) => void;
|
|
1292
1423
|
type ClientOptions = {
|
|
@@ -1302,6 +1433,7 @@ declare class Client extends EventEmitter {
|
|
|
1302
1433
|
private loginResult;
|
|
1303
1434
|
private log;
|
|
1304
1435
|
private _cardJitsu;
|
|
1436
|
+
private _cppslol;
|
|
1305
1437
|
private intentionalDisconnect;
|
|
1306
1438
|
private disconnectNotified;
|
|
1307
1439
|
private connectionFailure;
|
|
@@ -1312,6 +1444,7 @@ declare class Client extends EventEmitter {
|
|
|
1312
1444
|
get loginMessage(): string | null;
|
|
1313
1445
|
get loginStatus(): "active" | "banned";
|
|
1314
1446
|
get cardJitsu(): CardJitsu;
|
|
1447
|
+
get cppslol(): Cppslol;
|
|
1315
1448
|
constructor(server: AdapterName, options?: ClientOptions);
|
|
1316
1449
|
login(options: LoginOptions | TokenLoginOptions, operationOptions?: ClientOperationOptions): Promise<ServerInfo[]>;
|
|
1317
1450
|
connect(serverName: string, options?: ConnectOptions): Promise<void>;
|
|
@@ -1403,4 +1536,4 @@ declare class Client extends EventEmitter {
|
|
|
1403
1536
|
private handleMessage;
|
|
1404
1537
|
}
|
|
1405
1538
|
|
|
1406
|
-
export { type AdapterName, BaseAdapter, type Buddy, CardJitsu, Client, type ClientConnectionTimeouts, type ClientDisconnectInfo, type ClientLifecyclePhase, type ClientLifecycleUpdate, type ClientMessages, ClientOperationError, type ClientOperationErrorCategory, type ClientOperationErrorOptions, type ClientOperationOptions, type ClientOptions, type ConnectOptions, type ConnectionProfile, type ConnectionProfileInput, type ConnectionProfilePreset, type CpjourneyClientMessages, type CpjourneyServerMessages, DEFAULT_CLIENT_CONNECTION_TIMEOUTS, type FurnitureStoreItem, type GameCard, type GamePlayer, type IglooFurniturePlacement, type IglooStoreItem, type LogFn, type LoginOptions, type LoginResult, type Mascot, type MatState, type NinjaCard, type NinjaData, type NinjaProgress, type PlayerAppearance, type PlayerData, type PlayerSettings, type Postcard, type Puffle, type PuffleWellbeing, type QueueUpdate, type RevealedCard, type RoomUser, type RoundResult, type ServerInfo, type ServerMessages, type TokenLoginOptions, sanitizeClientErrorMessage };
|
|
1539
|
+
export { type AdapterName, BaseAdapter, type Buddy, CardJitsu, Client, type ClientConnectionTimeouts, type ClientDisconnectInfo, type ClientLifecyclePhase, type ClientLifecycleUpdate, type ClientMessages, ClientOperationError, type ClientOperationErrorCategory, type ClientOperationErrorOptions, type ClientOperationOptions, type ClientOptions, type ConnectOptions, type ConnectionProfile, type ConnectionProfileInput, type ConnectionProfilePreset, type CpjourneyClientMessages, type CpjourneyServerMessages, Cppslol, type CppslolClientMessages, type CppslolServerMessages, DEFAULT_CLIENT_CONNECTION_TIMEOUTS, type FurnitureStoreItem, type GameCard, type GamePlayer, type IglooFurniturePlacement, type IglooStoreItem, type LogFn, type LoginOptions, type LoginResult, type Mascot, type MatState, type NinjaCard, type NinjaData, type NinjaProgress, type PlayerAppearance, type PlayerData, type PlayerSettings, type Postcard, type Puffle, type PuffleWellbeing, type QueueUpdate, type RevealedCard, type RoomUser, type RoundResult, type ServerInfo, type ServerMessages, type TokenLoginOptions, sanitizeClientErrorMessage };
|