@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.
- package/CHANGELOG.md +22 -0
- package/README.md +49 -10
- package/dist/core/i18n.js +43 -1
- package/dist/core/i18n.js.map +1 -1
- package/dist/index.d.ts +217 -30
- package/dist/index.js.map +1 -1
- package/dist/realtime/roomBot.js +39 -0
- package/dist/realtime/roomBot.js.map +1 -1
- package/dist/resources/billing.d.ts +80 -1
- package/dist/resources/billing.js +32 -0
- package/dist/resources/billing.js.map +1 -1
- package/dist/resources/chat.d.ts +3 -1
- package/dist/resources/chat.js +19 -0
- package/dist/resources/chat.js.map +1 -1
- package/dist/resources/friend.d.ts +1 -12
- package/dist/resources/friend.js +3 -18
- package/dist/resources/friend.js.map +1 -1
- package/dist/resources/playlist.d.ts +33 -8
- package/dist/resources/playlist.js +29 -3
- package/dist/resources/playlist.js.map +1 -1
- package/dist/resources/room.d.ts +32 -3
- package/dist/resources/room.js +59 -6
- package/dist/resources/room.js.map +1 -1
- package/dist/resources/roomBot.d.ts +6 -1
- package/dist/resources/roomBot.js +7 -2
- package/dist/resources/roomBot.js.map +1 -1
- package/dist/resources/settings.d.ts +53 -2
- package/dist/resources/settings.js +32 -0
- package/dist/resources/settings.js.map +1 -1
- package/dist/resources/shop.d.ts +5 -0
- package/dist/resources/shop.js +3 -0
- package/dist/resources/shop.js.map +1 -1
- package/dist/resources/source.d.ts +6 -6
- package/dist/resources/source.js +6 -3
- package/dist/resources/source.js.map +1 -1
- package/dist/resources/system.d.ts +3 -1
- package/dist/resources/system.js +6 -0
- package/dist/resources/system.js.map +1 -1
- package/dist/types.d.ts +233 -7
- package/dist/utils/roomQueue.js +39 -13
- package/dist/utils/roomQueue.js.map +1 -1
- 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
|
-
####
|
|
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: [
|
|
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.
|
|
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.
|
|
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.
|
|
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[
|
|
130
|
+
...(DEFAULT_MESSAGES[resolvedLocale] ?? DEFAULT_MESSAGES["en-US"]),
|
|
89
131
|
...overrides,
|
|
90
132
|
};
|
|
91
133
|
return (key, values) => interpolateMessage(dictionary[key], values);
|
package/dist/core/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"AAOA,MAAM,cAAc,GAAmB,OAAO,CAAC;AAE/C,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"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"}
|