@wavezfm/api 0.1.8 → 0.2.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +49 -10
  3. package/dist/core/i18n.js +43 -1
  4. package/dist/core/i18n.js.map +1 -1
  5. package/dist/index.d.ts +217 -30
  6. package/dist/index.js.map +1 -1
  7. package/dist/realtime/roomBot.js +39 -0
  8. package/dist/realtime/roomBot.js.map +1 -1
  9. package/dist/resources/billing.d.ts +80 -1
  10. package/dist/resources/billing.js +32 -0
  11. package/dist/resources/billing.js.map +1 -1
  12. package/dist/resources/chat.d.ts +3 -1
  13. package/dist/resources/chat.js +19 -0
  14. package/dist/resources/chat.js.map +1 -1
  15. package/dist/resources/friend.d.ts +1 -12
  16. package/dist/resources/friend.js +3 -18
  17. package/dist/resources/friend.js.map +1 -1
  18. package/dist/resources/playlist.d.ts +33 -8
  19. package/dist/resources/playlist.js +29 -3
  20. package/dist/resources/playlist.js.map +1 -1
  21. package/dist/resources/room.d.ts +32 -3
  22. package/dist/resources/room.js +59 -6
  23. package/dist/resources/room.js.map +1 -1
  24. package/dist/resources/roomBot.d.ts +6 -1
  25. package/dist/resources/roomBot.js +7 -2
  26. package/dist/resources/roomBot.js.map +1 -1
  27. package/dist/resources/settings.d.ts +53 -2
  28. package/dist/resources/settings.js +32 -0
  29. package/dist/resources/settings.js.map +1 -1
  30. package/dist/resources/shop.d.ts +5 -0
  31. package/dist/resources/shop.js +3 -0
  32. package/dist/resources/shop.js.map +1 -1
  33. package/dist/resources/source.d.ts +6 -6
  34. package/dist/resources/source.js +6 -3
  35. package/dist/resources/source.js.map +1 -1
  36. package/dist/resources/system.d.ts +3 -1
  37. package/dist/resources/system.js +6 -0
  38. package/dist/resources/system.js.map +1 -1
  39. package/dist/types.d.ts +233 -7
  40. package/dist/utils/roomQueue.js +39 -13
  41. package/dist/utils/roomQueue.js.map +1 -1
  42. package/package.json +3 -2
package/CHANGELOG.md ADDED
@@ -0,0 +1,22 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0
4
+
5
+ ### Added
6
+
7
+ - Chat image uploads and media previews.
8
+ - External room media validation, metadata, Google Drive helpers, room leave, playback history, deletion, audit-log clearing, and word filters.
9
+ - Playlist search, ordering, availability checks, JSON import/export, track clipping, recent-room filtering, and paginated media search.
10
+ - GIF favorites, Last.fm account flows, Discord role sync, and social-image settings.
11
+ - Subscription management, payment history, miscellaneous checkout, Mercado Pago, and room subscription gifts.
12
+ - Notification center status and clearing.
13
+ - Room-bot word filters and superfans.
14
+
15
+ ### Fixed
16
+
17
+ - Unwrapped room detail responses so `room.getBySlug()` and slug-based joins return the actual room.
18
+ - Corrected paginated media search, playlist mutation, user settings, and checkout response types to match the server.
19
+
20
+ ### Removed
21
+
22
+ - Obsolete friend-request methods whose server routes no longer exist. Fan and superfan methods remain under `client.friend` for compatibility.
package/README.md CHANGED
@@ -159,6 +159,9 @@ await client.settings.update({
159
159
  presenceStatus: "busy",
160
160
  showChatBadge: true,
161
161
  });
162
+ await client.settings.getGifFavorites();
163
+ await client.settings.replaceGifFavorites(favorites);
164
+ const lastFm = await client.settings.getLastFmAccount();
162
165
  await client.settings.getTwoFactor();
163
166
  await client.settings.startEmailTwoFactor({ password: "secret" });
164
167
  await client.settings.startAuthenticatorTwoFactor({ password: "secret" });
@@ -183,8 +186,11 @@ await client.room.getBySlug("wavezfm-lounge");
183
186
  await client.room.getWaitlist("wavezfm-lounge");
184
187
  await client.room.create({ slug: "my-room", name: "My Room" });
185
188
  await client.room.join("wavezfm-lounge");
189
+ await client.room.leave("room-id");
186
190
  await client.room.favorite("room-id");
187
191
  await client.room.getManagement("room-id");
192
+ await client.room.getPlaybackHistory("room-id", 40);
193
+ await client.room.validateExternalMedia("https://youtu.be/...");
188
194
  ```
189
195
 
190
196
  #### Playlists
@@ -194,12 +200,19 @@ await client.playlist.list();
194
200
  await client.playlist.create("My Playlist");
195
201
  await client.playlist.update("playlist-id", { name: "Late Night Set" });
196
202
  await client.playlist.getTracks("playlist-id");
203
+ await client.playlist.searchTracks("nightcore");
197
204
  await client.playlist.previewUrl("https://youtube.com/watch?v=dQw4w9WgXcQ");
198
205
  await client.playlist.addTrack("playlist-id", {
199
206
  source: "youtube",
200
207
  sourceId: "dQw4w9WgXcQ",
201
208
  });
202
209
  await client.playlist.reorderTracks("playlist-id", ["track-a", "track-b"]);
210
+ await client.playlist.updateTrackClip("playlist-id", "track-id", {
211
+ clipStartMs: 15_000,
212
+ clipEndMs: 90_000,
213
+ });
214
+ await client.playlist.exportJson("playlist-id");
215
+ await client.playlist.importJson({ data: exportedPlaylist });
203
216
  await client.playlist.startSpotifyImport({
204
217
  playlistId: "playlist-id",
205
218
  url: "https://open.spotify.com/playlist/...",
@@ -209,7 +222,8 @@ await client.playlist.startSpotifyImport({
209
222
  #### Sources
210
223
 
211
224
  ```ts
212
- await client.source.searchYouTube("lofi hip hop", 10);
225
+ const youtube = await client.source.searchYouTube("lofi hip hop", 10);
226
+ console.log(youtube.data.items, youtube.data.nextPageToken);
213
227
  await client.source.searchSoundCloud("nightcore", 10);
214
228
  await client.source.searchAll("ambient");
215
229
  ```
@@ -219,6 +233,8 @@ await client.source.searchAll("ambient");
219
233
  ```ts
220
234
  await client.chat.getMessages("room-id", 0, 50);
221
235
  await client.chat.getMessagesBySlug("wavezfm-lounge", 0, 50);
236
+ await client.chat.previewMedia("https://prnt.sc/...");
237
+ await client.chat.uploadImage(imageBlob, "cover.webp");
222
238
  await client.chat.updateMessage("room-id", "message-id", {
223
239
  content: "edited message",
224
240
  });
@@ -226,15 +242,13 @@ await client.chat.pinMessage("room-id", "message-id");
226
242
  await client.chat.clearChat("room-id");
227
243
  ```
228
244
 
229
- #### Friends / Fans
245
+ #### Fans
230
246
 
231
247
  ```ts
232
- await client.friend.list();
233
- await client.friend.pending();
234
- await client.friend.sendRequest("user-id");
235
- await client.friend.acceptRequest("request-id");
236
248
  await client.friend.follow("user-id");
237
249
  await client.friend.followers();
250
+ await client.friend.following();
251
+ await client.friend.superfans();
238
252
  ```
239
253
 
240
254
  #### Shop
@@ -251,6 +265,9 @@ await client.shop.getInventory();
251
265
 
252
266
  ```ts
253
267
  await client.billing.createSubscriptionCheckout({ cycle: "monthly" });
268
+ await client.billing.getCheckoutSessionStatus("cs_test_...");
269
+ await client.billing.cancelSubscription();
270
+ await client.billing.resumeSubscription();
254
271
  await client.billing.createDiamondCheckout({ quantity: 1000 });
255
272
  await client.billing.createRoomDonationCheckout("room-id", { amountCents: 500 });
256
273
  await client.billing.createGlobalDonationCheckout({ amountCents: 1000 });
@@ -266,6 +283,8 @@ await client.billing.listPendingGifts();
266
283
  ```ts
267
284
  await client.system.status();
268
285
  await client.system.publicStats();
286
+ await client.system.getNotificationCenterStatus();
287
+ await client.system.clearNotificationCenter();
269
288
  await client.system.health();
270
289
  ```
271
290
 
@@ -281,7 +300,18 @@ const client = createApiClient({
281
300
  const created = await client.room.createBotToken("room-id", {
282
301
  botName: "Night Shift Bot",
283
302
  commandPrefix: "!",
284
- permissions: ["read_state", "read_chat", "send_chat", "manage_room"],
303
+ permissions: [
304
+ "read_state",
305
+ "read_chat",
306
+ "send_chat",
307
+ "manage_queue",
308
+ "skip_others",
309
+ "mute_user",
310
+ "kick_user",
311
+ "ban_user",
312
+ "clear_chat",
313
+ "manage_room",
314
+ ],
285
315
  });
286
316
 
287
317
  const roomBotToken = created.data.token;
@@ -296,11 +326,12 @@ Important:
296
326
  - it is only available in that creation response
297
327
  - store it securely on your backend after creation
298
328
  - later, load it back with `client.api.setRoomBotToken(...)`
329
+ - `manage_room` works as a broad administrative permission; granular permissions such as `manage_queue`, `ban_user`, and `clear_chat` can be used when the bot should be narrower
299
330
 
300
331
  ### Bot Resources
301
332
 
302
333
  ```ts
303
- client.api.setRoomBotToken(process.env.WAVEZ_ROOM_BOT_TOKEN!);
334
+ client.api.setRoomBotToken(process.env.WAVEZFM_ROOM_BOT_TOKEN!);
304
335
 
305
336
  await client.roomBot.getState("room-id");
306
337
  await client.roomBot.getQueueStatus("room-id");
@@ -323,6 +354,14 @@ await client.roomBot.updateSettings("room-id", {
323
354
  actorUsername: "Night Shift Bot",
324
355
  },
325
356
  });
357
+ await client.roomBot.updateWordFilters("room-id", {
358
+ blockedWordPatterns: ["spam"],
359
+ });
360
+
361
+ const state = await client.roomBot.getState("room-id");
362
+ console.log(state.data.room?.description);
363
+ console.log(state.data.currentUser?.globalRole);
364
+ console.log(state.data.currentUser?.roomRole);
326
365
  ```
327
366
 
328
367
  `roomBot.getEvents()` is the normalized HTTP history surface.
@@ -348,7 +387,7 @@ import {
348
387
 
349
388
  const bot = createRoomBotRealtimeClient({
350
389
  baseURL: "https://api.wavez.fm",
351
- botToken: process.env.WAVEZ_ROOM_BOT_TOKEN!,
390
+ botToken: process.env.WAVEZFM_ROOM_BOT_TOKEN!,
352
391
  roomId: "room-id",
353
392
  locale: "en",
354
393
  autoReconnect: true,
@@ -404,7 +443,7 @@ try {
404
443
  const client = createApiClient({ baseURL: "https://api.wavez.fm" });
405
444
 
406
445
  client.api.setAuthToken("optional-bearer-token");
407
- client.api.setRoomBotToken(process.env.WAVEZ_ROOM_BOT_TOKEN!);
446
+ client.api.setRoomBotToken(process.env.WAVEZFM_ROOM_BOT_TOKEN!);
408
447
 
409
448
  client.api.getAuthToken();
410
449
  client.api.getRoomBotToken();
package/dist/core/i18n.js CHANGED
@@ -60,6 +60,36 @@ const DEFAULT_MESSAGES = {
60
60
  roomBotCreateExpiryNumberInvalid: "A expiração do room bot precisa ser um número válido de horas.",
61
61
  roomBotCreateExpiryRangeInvalid: "A expiração do room bot precisa ficar entre 1 e 720 horas.",
62
62
  },
63
+ "es-ES": {
64
+ fetchUnavailable: "La Fetch API no está disponible. Proporciona `fetch` en createApi(...) o usa un runtime con fetch nativo.",
65
+ baseUrlRequired: "`baseURL` es obligatorio para crear el cliente.",
66
+ requestTimedOut: "La solicitud expiró.",
67
+ roomPermissionManageRoom: "No puedes administrar esta sala.",
68
+ roomNotFound: "Sala no encontrada.",
69
+ roomBotInvalid: "Token de room bot inválido.",
70
+ roomBotScopeMismatch: "Este token de room bot no es válido para la sala solicitada.",
71
+ roomBotOwnerMissing: "El dueño del room bot ya no existe.",
72
+ roomBotOwnerBanned: "El dueño del room bot está suspendido de WavezFM.",
73
+ roomBotPermissionDenied: "Este token de room bot no incluye el permiso requerido.",
74
+ roomBotForbidden: "Este token de room bot no puede ejecutar esta acción.",
75
+ roomBotTokenRequired: "El token del room bot es obligatorio.",
76
+ roomBotMuted: "El dueño del room bot está silenciado en esta sala.",
77
+ roomBotWebsocketFactoryRequired: "WebSocket no disponible. Proporciona `websocketFactory` al crear el cliente realtime.",
78
+ roomBotWebsocketListenerUnsupported: "La implementación de WebSocket proporcionada no soporta listeners.",
79
+ roomBotWebsocketNotConnected: "WebSocket no conectado.",
80
+ roomBotWebsocketCreateFailed: "No se pudo crear el WebSocket del room bot.",
81
+ roomBotWebsocketConnectFailed: "No se pudo conectar el WebSocket del room bot.",
82
+ roomBotCreateNameLengthInvalid: "El nombre del bot debe tener entre 2 y 40 caracteres.",
83
+ roomBotCreateAvatarUrlInvalid: "La URL del avatar del bot es inválida.",
84
+ roomBotCreateAvatarUrlDirectImageRequired: "La URL del avatar del bot debe apuntar directamente a una imagen o GIF.",
85
+ roomBotCreatePermissionsArrayRequired: "Los permisos del room bot deben ser un array.",
86
+ roomBotCreatePermissionInvalid: "Permiso de room bot inválido.",
87
+ roomBotCreatePermissionRequired: "Se requiere al menos un permiso de room bot.",
88
+ roomBotCreatePrefixLengthInvalid: "El prefijo del bot debe tener entre 1 y 12 caracteres.",
89
+ roomBotCreatePrefixWhitespaceInvalid: "El prefijo del bot no puede contener espacios.",
90
+ roomBotCreateExpiryNumberInvalid: "La expiración del room bot debe ser un número válido de horas.",
91
+ roomBotCreateExpiryRangeInvalid: "La expiración del room bot debe estar entre 1 y 720 horas.",
92
+ },
63
93
  };
64
94
  const ERROR_CODE_MESSAGE_MAP = {
65
95
  ROOM_PERMISSION_MANAGE_ROOM: "roomPermissionManageRoom",
@@ -69,6 +99,7 @@ const ERROR_CODE_MESSAGE_MAP = {
69
99
  ROOM_BOT_OWNER_MISSING: "roomBotOwnerMissing",
70
100
  ROOM_BOT_OWNER_BANNED: "roomBotOwnerBanned",
71
101
  ROOM_BOT_PERMISSION_DENIED: "roomBotPermissionDenied",
102
+ ROOM_BOT_MANAGE_FORBIDDEN: "roomBotForbidden",
72
103
  ROOM_BOT_FORBIDDEN: "roomBotForbidden",
73
104
  ROOM_BOT_TOKEN_REQUIRED: "roomBotTokenRequired",
74
105
  ROOM_BOT_MUTED: "roomBotMuted",
@@ -82,10 +113,21 @@ function interpolateMessage(template, values) {
82
113
  return value == null ? `{${key}}` : String(value);
83
114
  });
84
115
  }
116
+ function resolveMessageLocale(locale) {
117
+ const normalized = String(locale).trim().toLowerCase();
118
+ if (normalized.startsWith("pt")) {
119
+ return "pt-BR";
120
+ }
121
+ if (normalized.startsWith("es")) {
122
+ return "es-ES";
123
+ }
124
+ return "en-US";
125
+ }
85
126
  export function createSdkMessageFormatter(locale = DEFAULT_LOCALE, overrides = {}) {
127
+ const resolvedLocale = resolveMessageLocale(locale);
86
128
  const dictionary = {
87
129
  ...DEFAULT_MESSAGES["en-US"],
88
- ...(DEFAULT_MESSAGES[locale] ?? DEFAULT_MESSAGES["en-US"]),
130
+ ...(DEFAULT_MESSAGES[resolvedLocale] ?? DEFAULT_MESSAGES["en-US"]),
89
131
  ...overrides,
90
132
  };
91
133
  return (key, values) => interpolateMessage(dictionary[key], values);
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"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"}