@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 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. CPJourney-specific wire
227
- contracts are also exported separately as `CpjourneyClientMessages` and
228
- `CpjourneyServerMessages`; unsupported methods throw or reject with a
229
- non-retryable `ClientOperationError` whose category is
230
- `unsupported_operation`. Shared actions should be normalized by each adapter
231
- rather than assuming identical wire payloads.
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: Record<string, never>;
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: Record<string, never>;
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 };