@ix-xs/twitch.api 1.0.1 → 1.0.3

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 (3) hide show
  1. package/README.md +15 -2
  2. package/package.json +20 -20
  3. package/twitchapi.js +1204 -1144
package/twitchapi.js CHANGED
@@ -1,8 +1,8 @@
1
1
  /* eslint-disable no-trailing-spaces */
2
2
 
3
- const { writeFileSync, existsSync } = require("node:fs");
3
+ const { writeFileSync } = require("node:fs");
4
4
  const TwitchTokenPath = process.cwd() + "/node_modules/@ix-xs/twitch.api/Token.json";
5
- const TwitchToken = require(TwitchTokenPath);
5
+ let TwitchToken = require(TwitchTokenPath);
6
6
 
7
7
  module.exports = class {
8
8
 
@@ -21,370 +21,435 @@ module.exports = class {
21
21
  */
22
22
  constructor(config) {
23
23
 
24
- this.clientId = config.clientId;
25
- this.clientSecret = config.clientSecret;
26
- this.token = TwitchToken;
27
-
28
- /**
29
- * 👀 **Génère un nouveau token**
30
- * 💡 **Note** : Le token se gère de façon automatique, cette fonction sert uniquement a son auto-gestion
31
- *
32
- * ---
33
- * @returns {Promise<{
34
- * ok:boolean,
35
- * statusText?:string,
36
- * error?:string,
37
- * result?:{
38
- * created_at:number,
39
- * access_token:string,
40
- * expires_in:number,
41
- * token_type:string,
42
- * }
43
- * }>} **Renvoi une promesse d'objet** :
44
- *
45
- * • `ok` : État de la requête (true ou false)
46
- * • `statusText?` : État de la requête (similaire à error)
47
- * • `error?` : Erreur lors de la génération du token
48
- * • `result?` : Résultat
49
- * > • `created_at` : Date de la création du token
50
- * > • `access_token` : Le code (token) généré
51
- * > • `expires_in` : Délais (en secondes) de l'expiration du token
52
- * > • `token_type` : Le type du token ("Bearer")
53
- *
54
- * ---
55
- * @example
56
- * client.generateToken().then(console.log);
57
- *
58
- * // Exemple de réponse :
59
- * // {
60
- * // ok: true,
61
- * // result: {
62
- * // created_at: 1637167088,
63
- * // access_token: "abcdefgh123456789",
64
- * // expires_in: 3600,
65
- * // token_type: "Bearer",
66
- * // },
67
- * // }
68
- */
69
- this.generateToken = async () => {
70
-
71
- try {
72
-
73
- const _ = await fetch(`https://id.twitch.tv/oauth2/token?client_id=${this.clientId}&client_secret=${this.clientSecret}&grant_type=client_credentials`, {
74
- method:"POST",
75
- });
76
-
77
- if (!_.ok) {
78
- return { ok:false, statusText:_.statusText };
79
- }
80
-
81
- const result = await _.json();
82
- result.token_type = "Bearer";
83
- result.created_at = new Date().getTime();
84
- writeFileSync(TwitchTokenPath, JSON.stringify(result, null, 4));
85
- return { ok:true, result };
86
-
87
- }
24
+ this.clientId = config.clientId;
25
+ this.clientSecret = config.clientSecret;
26
+ this.token = TwitchToken;
27
+ this.validateInterval = null;
88
28
 
89
- catch (error) {
90
- return { ok:false, error:error.stack };
91
- }
92
-
93
- };
94
- /**
95
- * 👀 **Renvoi la validité du token actuel**
96
- *
97
- * ---
98
- * @returns {boolean} **Renvoi `true` si le token a expiré, sinon `false`**
99
- *
100
- * ---
101
- * @example
102
- * console.log(client.isExpiredToken());
103
- *
104
- * // Exemple de réponse :
105
- * // true
106
- */
107
- this.isExpiredToken = () => {
108
-
109
- if (!existsSync(TwitchTokenPath)) {
110
- writeFileSync(TwitchTokenPath, JSON.stringify({
111
- access_token:"",
112
- expires_in:0,
113
- token_type:"",
114
- created_at:0,
115
- }, null, 4));
116
- }
117
-
118
- const now = Math.floor(Date.now() / 1000);
119
- const createdAt = this.token.created_at;
120
- const expiresIn = this.token.expires_in;
121
- const expirationTime = createdAt + expiresIn;
122
-
123
- return now >= expirationTime;
124
-
125
- };
126
- /**
127
- * 👀 **Génère un nouveau token**
128
- * 💡 **Note** : Le token se gère de façon automatique, cette fonction sert uniquement a son auto-gestion
129
- *
130
- * ---
131
- * @returns {Promise<{
132
- * ok:boolean,
133
- * statusText?:string,
134
- * error?:string,
135
- * result?:{
136
- * created_at:number,
137
- * access_token:string,
138
- * expires_in:number,
139
- * token_type:string,
140
- * }
141
- * }>} **Renvoi une promesse d'objet** :
142
- *
143
- * • `ok` : État de la requête (true ou false)
144
- * • `statusText?` : État de la requête (similaire à error)
145
- * • `error?` : Erreur lors de la génération du token
146
- * • `result?` : Résultat
147
- * > • `created_at` : Date de la création du token
148
- * > • `access_token` : Le code (token) généré
149
- * > • `expires_in` : Délais (en secondes) de l'expiration du token
150
- * > • `token_type` : Le type du token ("Bearer")
151
- *
152
- * ---
153
- * @example
154
- * client.refreshToken().then(console.log);
155
- *
156
- * // Exemple de réponse :
157
- * // {
158
- * // ok: true,
159
- * // result: {
160
- * // created_at: 1637167088,
161
- * // access_token: "abcdefgh123456789",
162
- * // expires_in: 3600,
163
- * // token_type: "Bearer",
164
- * // },
165
- * // }
166
- */
167
- this.refreshToken = async () => {
168
-
169
- try {
170
-
171
- const newToken = await this.generateToken();
172
-
173
- if (!newToken.ok) {
174
- return { ok:false, error:newToken.error ?? newToken.statusText };
175
- }
176
-
177
- writeFileSync(TwitchTokenPath, JSON.stringify(newToken.result, null, 4));
178
- return { ok:true, result:newToken.result };
29
+ }
179
30
 
180
- }
31
+ /**
32
+ * 👀 **Démarre le client**
33
+ * 💡 **Note** : Cette fonction est requise afin de démarrer la surveillance du token qui doit maintenant être valider toutes les heures
34
+ *
35
+ * ---
36
+ * @example
37
+ * await client.initialize();
38
+ */
39
+ async initialize() {
40
+ if (this.isExpiredToken()) {
41
+ await this.refreshToken();
42
+ }
43
+ await this.validateToken();
44
+ this.startPeriodicValidation();
45
+ }
46
+ /**
47
+ * 👀 **Génère un nouveau token**
48
+ * 💡 **Note** : Le token se gère de façon automatique, cette fonction sert uniquement a son auto-gestion
49
+ *
50
+ * ---
51
+ * @returns {Promise<{
52
+ * ok:boolean,
53
+ * statusText?:string,
54
+ * error?:string,
55
+ * result?:{
56
+ * created_at:number,
57
+ * access_token:string,
58
+ * expires_in:number,
59
+ * token_type:string,
60
+ * }
61
+ * }>} **Renvoi une promesse d'objet** :
62
+ *
63
+ * • `ok` : État de la requête (true ou false)
64
+ * • `statusText?` : État de la requête (similaire à error)
65
+ * • `error?` : Erreur lors de la génération du token
66
+ * • `result?` : Résultat
67
+ * > • `created_at` : Date de la création du token
68
+ * > • `access_token` : Le code (token) généré
69
+ * > • `expires_in` : Délais (en secondes) de l'expiration du token
70
+ * > • `token_type` : Le type du token ("Bearer")
71
+ *
72
+ * ---
73
+ * @example
74
+ * client.generateToken().then(console.log);
75
+ *
76
+ * // Exemple de réponse :
77
+ * // {
78
+ * // ok: true,
79
+ * // result: {
80
+ * // created_at: 1637167088,
81
+ * // access_token: "abcdefgh123456789",
82
+ * // expires_in: 3600,
83
+ * // token_type: "Bearer",
84
+ * // },
85
+ * // }
86
+ */
87
+ async generateToken() {
88
+ try {
89
+ const response = await fetch(`https://id.twitch.tv/oauth2/token?client_id=${this.clientId}&client_secret=${this.clientSecret}&grant_type=client_credentials`, {
90
+ method: "POST",
91
+ });
92
+
93
+ if (!response.ok) {
94
+ return { ok: false, statusText: response.statusText };
95
+ }
96
+
97
+ const result = await response.json();
98
+ result.token_type = "Bearer";
99
+ result.created_at = new Date().getTime();
100
+ this.updateTokenFile(result);
101
+ return { ok: true, result };
102
+ } catch (error) {
103
+ return { ok: false, error: error.stack };
104
+ }
105
+ }
106
+ /**
107
+ * 👀 **Renvoi la validité du token actuel**
108
+ *
109
+ * ---
110
+ * @returns {boolean} **Renvoi `true` si le token a expiré, sinon `false`**
111
+ *
112
+ * ---
113
+ * @example
114
+ * console.log(client.isExpiredToken());
115
+ *
116
+ * // Exemple de réponse :
117
+ * // true
118
+ */
119
+ isExpiredToken() {
120
+ if (!this.token.access_token || this.token.access_token === "") {
121
+ return true;
122
+ }
123
+
124
+ const now = Math.floor(Date.now() / 1000);
125
+ const createdAt = Math.floor(this.token.created_at / 1000);
126
+ const expiresIn = this.token.expires_in;
127
+ const expirationTime = createdAt + expiresIn;
128
+
129
+ return now >= expirationTime;
130
+ }
131
+ /**
132
+ * 👀 **Génère un nouveau token**
133
+ * 💡 **Note** : Le token se gère de façon automatique, cette fonction sert uniquement a son auto-gestion
134
+ *
135
+ * ---
136
+ * @returns {Promise<{
137
+ * ok:boolean,
138
+ * statusText?:string,
139
+ * error?:string,
140
+ * result?:{
141
+ * created_at:number,
142
+ * access_token:string,
143
+ * expires_in:number,
144
+ * token_type:string,
145
+ * }
146
+ * }>} **Renvoi une promesse d'objet** :
147
+ *
148
+ * • `ok` : État de la requête (true ou false)
149
+ * • `statusText?` : État de la requête (similaire à error)
150
+ * • `error?` : Erreur lors de la génération du token
151
+ * • `result?` : Résultat
152
+ * > • `created_at` : Date de la création du token
153
+ * > • `access_token` : Le code (token) généré
154
+ * > • `expires_in` : Délais (en secondes) de l'expiration du token
155
+ * > • `token_type` : Le type du token ("Bearer")
156
+ *
157
+ * ---
158
+ * @example
159
+ * client.refreshToken().then(console.log);
160
+ *
161
+ * // Exemple de réponse :
162
+ * // {
163
+ * // ok: true,
164
+ * // result: {
165
+ * // created_at: 1637167088,
166
+ * // access_token: "abcdefgh123456789",
167
+ * // expires_in: 3600,
168
+ * // token_type: "Bearer",
169
+ * // },
170
+ * // }
171
+ */
172
+ async refreshToken() {
173
+ try {
174
+ const newToken = await this.generateToken();
175
+
176
+ if (!newToken.ok) {
177
+ return { ok: false, error: newToken.error ?? newToken.statusText };
178
+ }
179
+
180
+ this.updateTokenFile(newToken.result);
181
+ return { ok: true, result: newToken.result };
182
+ } catch (error) {
183
+ return { ok: false, error: error.stack };
184
+ }
185
+ }
186
+ /**
187
+ * 👀 **Valide le token**
188
+ * 💡 **Note** : Le token se gère de façon automatique, cette fonction sert uniquement a son auto-gestion
189
+ *
190
+ * ---
191
+ * @example
192
+ * await client.validateToken();
193
+ */
194
+ async validateToken() {
195
+ try {
196
+ if (!this.token.access_token || this.token.access_token === "") {
197
+ await this.refreshToken();
198
+ }
199
+
200
+ const response = await fetch(`https://id.twitch.tv/oauth2/validate`, {
201
+ headers: {
202
+ Authorization: `Bearer ${this.token.access_token}`
203
+ }
204
+ });
205
+
206
+ if (!response.ok) {
207
+ if (response.status === 401) {
208
+ await this.refreshToken();
209
+ return this.validateToken();
210
+ }
211
+ return { ok: false, statusText: response.statusText };
212
+ }
213
+
214
+ const result = await response.json();
215
+ return { ok: true, result };
216
+ } catch (error) {
217
+ return { ok: false, error: error.stack };
218
+ }
219
+ }
220
+ /**
221
+ * 👀 **Met à jour le token**
222
+ * 💡 **Note** : Le token se gère de façon automatique, cette fonction sert uniquement a son auto-gestion
223
+ *
224
+ * ---
225
+ * @example
226
+ * await client.updateTokenFile();
227
+ */
228
+ updateTokenFile(tokenData) {
229
+ writeFileSync(TwitchTokenPath, JSON.stringify(tokenData, null, 4));
230
+ this.token = tokenData;
231
+ TwitchToken = tokenData;
232
+ }
233
+ /**
234
+ * 👀 **Démarre la surveillance pour la validation periodique du token (toutes les heures)**
235
+ * 💡 **Note** : Le token se gère de façon automatique, cette fonction sert uniquement a son auto-gestion
236
+ *
237
+ * ---
238
+ * @example
239
+ * await client.startPeriodicValidation();
240
+ */
241
+ startPeriodicValidation() {
242
+ if (this.validateInterval) {
243
+ clearInterval(this.validateInterval);
244
+ }
245
+ this.validateInterval = setInterval(async () => {
246
+ const validation = await this.validateToken();
247
+ if (!validation.ok) {
248
+ console.error("Token validation failed:", validation.error || validation.statusText);
249
+ }
250
+ }, 3600000); // 1 hour in milliseconds
251
+ }
252
+ /**
253
+ * 👀 **Renvoi une liste des streams**
254
+ * 💡 **Note** : La liste est classée par ordre décroissant du nombre de téléspectateurs regardant le flux. Étant donné que les spectateurs vont et viennent pendant un flux, il est possible de trouver des flux en double ou manquants dans la liste au fur et à mesure que vous parcourez les résultats.
255
+ *
256
+ * ---
257
+ * @param {{
258
+ * users_names?:Array<string>,
259
+ * games_names?:Array<string>,
260
+ * type?:"all"|"live",
261
+ * languages?:Array<string>,
262
+ * first?:number,
263
+ * before?:string,
264
+ * after?:string,
265
+ * }} [params] **Paramètres de filtrage** :
266
+ *
267
+ * • `users_names` : Les noms d'utilisateurs utilisés pour filtrer la liste des flux. Renvoie uniquement les flux des utilisateurs qui diffusent. Vous pouvez spécifier un maximum de 100 noms d'utilisateurs.
268
+ * • `games_names` : Les noms des jeux (catégories) utilisés pour filtrer la liste des flux. Renvoie uniquement les flux qui diffusent les jeux (catégories). Vous pouvez spécifier un maximum de 100 noms.
269
+ * • `type` : Type de flux par lequel filtrer la liste des flux. Par défaut : "all".
270
+ * • `languages` : Un code de langue utilisé pour filtrer la liste des flux. Renvoie uniquement les flux diffusés dans la langue spécifiée. Spécifiez la langue à l'aide d'un code de langue à deux lettres ISO 639-1 ou autre si la diffusion utilise une langue ne figurant pas dans la liste des [langues de diffusion prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch?langue=en_US#streamlang). Vous pouvez spécifier un maximum de 100 codes de langue.
271
+ * • `first` : Nombre maximum d'éléments à renvoyer par page dans la réponse. La taille minimale de la page est de 1 élément par page et la taille maximale est de 100 éléments par page. La valeur par défaut est 20.
272
+ * • `before` : Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
273
+ * • `after` : Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
274
+ *
275
+ * ---
276
+ * @returns {Promise<{
277
+ * ok:boolean,
278
+ * statusText?:string,
279
+ * error?:string,
280
+ * result?:Array<{
281
+ * id:string,
282
+ * user_id:string,
283
+ * user_login:string,
284
+ * user_name:string,
285
+ * game_id:string,
286
+ * game_name:string,
287
+ * type:"live"|"",
288
+ * title:string|"",
289
+ * tags:Array<string>,
290
+ * viewer_count:number,
291
+ * started_at:string,
292
+ * language:string,
293
+ * thumbnail_url:string,
294
+ * tag_ids:[],
295
+ * is_mature:boolean
296
+ * }>
297
+ * }>} **Renvoi une promesse d'objet** :
298
+ *
299
+ * • `ok` : État de la requête (true ou false)
300
+ * • `statusText?` : État de la requête (similaire à error)
301
+ * • `error?` : Erreur lors de la récupération des streams
302
+ * • `result?` La liste des flux.
303
+ * > • `id` Un identifiant qui identifie le flux. Vous pourrez utiliser cet identifiant ultérieurement pour rechercher la vidéo à la demande (VOD).
304
+ * > • `user_id` L'ID de l'utilisateur qui diffuse le flux.
305
+ * > • `user_login` Le nom de connexion de l'utilisateur.
306
+ * > • `user_name` Le nom d'affichage de l'utilisateur.
307
+ * > • `game_id` L'ID de la catégorie ou du jeu en cours de lecture.
308
+ * > • `game_name` Le nom de la catégorie ou du jeu en cours.
309
+ * > • `type` Le type de flux. Si une erreur se produit, ce champ est défini sur une chaîne vide.
310
+ * > • `title` Le titre du flux. Est une chaîne vide si elle n'est pas définie.
311
+ * > • `tags` Les balises appliquées au flux.
312
+ * > • `viewer_count` Le nombre d'utilisateurs regardant le flux.
313
+ * > • `started_at` La date et l'heure UTC (au format RFC3339) du début de la diffusion.
314
+ * > • `langue` La langue utilisée par le flux. Il s'agit d'un code de langue à deux lettres ISO 639-1 ou autre si le flux utilise une langue qui ne figure pas dans la liste des [langues de flux prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch ?langue=en_US#streamlang).
315
+ * > • `thumbnail_url` Une URL vers une image d'une image des 5 dernières minutes du flux. Remplacez les espaces réservés de largeur et de hauteur dans l'URL (**{width}x{height}**) par la taille de l'image souhaitée, en pixels.
316
+ * > • `tag_ids` **IMPORTANT** Depuis le 28 février 2023, ce champ est obsolète et renvoie uniquement un tableau vide.
317
+ * > • `is_mature` Une valeur booléenne qui indique si le flux est destiné à un public adulte.
318
+ *
319
+ * ---
320
+ * @example
321
+ * client.getStreams().then(console.log); // Obtient des informations sur les 20 flux les plus actifs.
322
+ *
323
+ * client.getStreams({
324
+ users_logins:["twitchdev"]
325
+ }).then(console.log); // Obtient les flux pour les connexions spécifiées. Si l’utilisateur n’est pas en direct, la réponse ne l’inclut pas.
326
+ */
327
+ async getStreams(params) {
181
328
 
182
- catch (error) {
183
- return { ok:false, error:error.stack };
184
- }
329
+ try {
185
330
 
186
- };
187
- /**
188
- * 👀 **Renvoi une liste des streams**
189
- * 💡 **Note** : La liste est classée par ordre décroissant du nombre de téléspectateurs regardant le flux. Étant donné que les spectateurs vont et viennent pendant un flux, il est possible de trouver des flux en double ou manquants dans la liste au fur et à mesure que vous parcourez les résultats.
190
- *
191
- * ---
192
- * @param {{
193
- * users_names?:Array<string>,
194
- * games_names?:Array<string>,
195
- * type?:"all"|"live",
196
- * languages?:Array<string>,
197
- * first?:number,
198
- * before?:string,
199
- * after?:string,
200
- * }} [params] **Paramètres de filtrage** :
201
- *
202
- * • `users_names` : Les noms d'utilisateurs utilisés pour filtrer la liste des flux. Renvoie uniquement les flux des utilisateurs qui diffusent. Vous pouvez spécifier un maximum de 100 noms d'utilisateurs.
203
- * • `games_names` : Les noms des jeux (catégories) utilisés pour filtrer la liste des flux. Renvoie uniquement les flux qui diffusent les jeux (catégories). Vous pouvez spécifier un maximum de 100 noms.
204
- * • `type` : Type de flux par lequel filtrer la liste des flux. Par défaut : "all".
205
- * • `languages` : Un code de langue utilisé pour filtrer la liste des flux. Renvoie uniquement les flux diffusés dans la langue spécifiée. Spécifiez la langue à l'aide d'un code de langue à deux lettres ISO 639-1 ou autre si la diffusion utilise une langue ne figurant pas dans la liste des [langues de diffusion prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch?langue=en_US#streamlang). Vous pouvez spécifier un maximum de 100 codes de langue.
206
- * • `first` : Nombre maximum d'éléments à renvoyer par page dans la réponse. La taille minimale de la page est de 1 élément par page et la taille maximale est de 100 éléments par page. La valeur par défaut est 20.
207
- * • `before` : Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
208
- * • `after` : Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
209
- *
210
- * ---
211
- * @returns {Promise<{
212
- * ok:boolean,
213
- * statusText?:string,
214
- * error?:string,
215
- * result?:Array<{
216
- * id:string,
217
- * user_id:string,
218
- * user_login:string,
219
- * user_name:string,
220
- * game_id:string,
221
- * game_name:string,
222
- * type:"live"|"",
223
- * title:string|"",
224
- * tags:Array<string>,
225
- * viewer_count:number,
226
- * started_at:string,
227
- * language:string,
228
- * thumbnail_url:string,
229
- * tag_ids:[],
230
- * is_mature:boolean
231
- * }>
232
- * }>} **Renvoi une promesse d'objet** :
233
- *
234
- * • `ok` : État de la requête (true ou false)
235
- * • `statusText?` : État de la requête (similaire à error)
236
- * • `error?` : Erreur lors de la récupération des streams
237
- * • `result?` La liste des flux.
238
- * > • `id` Un identifiant qui identifie le flux. Vous pourrez utiliser cet identifiant ultérieurement pour rechercher la vidéo à la demande (VOD).
239
- * > • `user_id` L'ID de l'utilisateur qui diffuse le flux.
240
- * > • `user_login` Le nom de connexion de l'utilisateur.
241
- * > • `user_name` Le nom d'affichage de l'utilisateur.
242
- * > • `game_id` L'ID de la catégorie ou du jeu en cours de lecture.
243
- * > • `game_name` Le nom de la catégorie ou du jeu en cours.
244
- * > • `type` Le type de flux. Si une erreur se produit, ce champ est défini sur une chaîne vide.
245
- * > • `title` Le titre du flux. Est une chaîne vide si elle n'est pas définie.
246
- * > • `tags` Les balises appliquées au flux.
247
- * > • `viewer_count` Le nombre d'utilisateurs regardant le flux.
248
- * > • `started_at` La date et l'heure UTC (au format RFC3339) du début de la diffusion.
249
- * > • `langue` La langue utilisée par le flux. Il s'agit d'un code de langue à deux lettres ISO 639-1 ou autre si le flux utilise une langue qui ne figure pas dans la liste des [langues de flux prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch ?langue=en_US#streamlang).
250
- * > • `thumbnail_url` Une URL vers une image d'une image des 5 dernières minutes du flux. Remplacez les espaces réservés de largeur et de hauteur dans l'URL (**{width}x{height}**) par la taille de l'image souhaitée, en pixels.
251
- * > • `tag_ids` **IMPORTANT** Depuis le 28 février 2023, ce champ est obsolète et renvoie uniquement un tableau vide.
252
- * > • `is_mature` Une valeur booléenne qui indique si le flux est destiné à un public adulte.
253
- *
254
- * ---
255
- * @example
256
- * client.getStreams().then(console.log); // Obtient des informations sur les 20 flux les plus actifs.
257
- *
258
- * client.getStreams({
259
- users_logins:["twitchdev"]
260
- }).then(console.log); // Obtient les flux pour les connexions spécifiées. Si l’utilisateur n’est pas en direct, la réponse ne l’inclut pas.
261
- */
262
- this.getStreams = async (params) => {
263
-
264
- try {
265
-
266
- let link = `https://api.twitch.tv/helix/streams`;
267
- const linkParams = [];
268
-
269
- if (params) {
270
-
271
- if (params.after) {
272
- linkParams.push(`after=${params.after}`);
273
- }
331
+ let link = `https://api.twitch.tv/helix/streams`;
332
+ const linkParams = [];
274
333
 
275
- if (params.before) {
276
- linkParams.push(`before=${params.before}`);
277
- }
334
+ if (params) {
278
335
 
279
- if (params.first) {
280
- linkParams.push(`first=${params.first}`);
281
- }
336
+ if (params.after) {
337
+ linkParams.push(`after=${params.after}`);
338
+ }
282
339
 
283
- if (params.games_names) {
284
- const games = await this.getGames(params.games_names);
285
- if (!games.ok) {
286
- return { ok:false, error:games.error ?? games.statusText };
287
- }
288
- const ids = games.result.map(game => game.id);
289
- linkParams.push(`game_id=${ids.slice(0, 100).join('&game_id=')}`);
290
- }
340
+ if (params.before) {
341
+ linkParams.push(`before=${params.before}`);
342
+ }
291
343
 
292
- if (params.languages) {
293
- linkParams.push(`language=${params.languages.slice(0, 100).join('&language=')}`);
294
- }
344
+ if (params.first) {
345
+ linkParams.push(`first=${params.first}`);
346
+ }
295
347
 
296
- if (params.type) {
297
- linkParams.push(`type=${params.type}`);
348
+ if (params.games_names) {
349
+ const games = await this.getGames(params.games_names);
350
+ if (!games.ok) {
351
+ return { ok:false, error:games.error ?? games.statusText };
298
352
  }
353
+ const ids = games.result.map(game => game.id);
354
+ linkParams.push(`game_id=${ids.slice(0, 100).join('&game_id=')}`);
355
+ }
299
356
 
300
- if (params.users_names) {
301
- const users = await this.getUsers(params.users_names);
302
- if (!users.ok) {
303
- return { ok:false, error:users.error ?? users.statusText };
304
- }
305
- const userIds = users.result.map(user => user.id);
306
- linkParams.push(`user_id=${userIds.slice(0, 100).join('&user_id=')}`);
307
- }
357
+ if (params.languages) {
358
+ linkParams.push(`language=${params.languages.slice(0, 100).join('&language=')}`);
359
+ }
308
360
 
361
+ if (params.type) {
362
+ linkParams.push(`type=${params.type}`);
309
363
  }
310
364
 
311
- if (this.isExpiredToken()) {
312
- await this.refreshToken();
365
+ if (params.users_names) {
366
+ const users = await this.getUsers(params.users_names);
367
+ if (!users.ok) {
368
+ return { ok:false, error:users.error ?? users.statusText };
369
+ }
370
+ const userIds = users.result.map(user => user.id);
371
+ linkParams.push(`user_id=${userIds.slice(0, 100).join('&user_id=')}`);
313
372
  }
314
373
 
315
- link += "?" + linkParams.join("&");
374
+ }
316
375
 
317
- const _ = await fetch(link, {
318
- method:"GET",
319
- headers:{
320
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
321
- "Client-Id":this.clientId,
322
- },
323
- });
376
+ if (this.isExpiredToken()) {
377
+ await this.refreshToken();
378
+ }
324
379
 
325
- if (!_.ok) {
326
- return { ok:false, statusText:_.statusText };
327
- }
380
+ link += "?" + linkParams.join("&");
328
381
 
329
- const result = await _.json();
330
- return { ok:true, result:result.data };
382
+ const _ = await fetch(link, {
383
+ method:"GET",
384
+ headers:{
385
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
386
+ "Client-Id":this.clientId,
387
+ },
388
+ });
331
389
 
390
+ if (!_.ok) {
391
+ return { ok:false, statusText:_.statusText };
332
392
  }
333
393
 
334
- catch (error) {
335
- return { ok:false, error:error.stack };
336
- }
394
+ const result = await _.json();
395
+ return { ok:true, result:result.data };
396
+
397
+ }
398
+ catch (error) {
399
+ return { ok:false, error:error.stack };
400
+ }
401
+ }
402
+ /**
403
+ * 👀 **Renvoi les informations d'un ou plusieurs utilisateur(s)**
404
+ *
405
+ * ---
406
+ * @param {Array<string>} usernames Les noms d'utilisateur des utilisateurs à obtenir. Le nombre maximum de noms d'utilisateur que vous pouvez spécifier est de 100.
407
+ *
408
+ * ---
409
+ * @returns {Promise<{
410
+ * ok:boolean,
411
+ * statusText?:string,
412
+ * result?:Array<{
413
+ * id:string,
414
+ * display_name:string,
415
+ * broadcaster_type:""|"affiliate"|"partner",
416
+ * description:string,
417
+ * profile_image_url:string,
418
+ * offline_image_url:string,
419
+ * view_count:number,
420
+ * created_at:string
421
+ * }>
422
+ * }>} **Renvoi une promesse d'objet** :
423
+ *
424
+ * • `ok` : État de la requête (true ou false)
425
+ * • `statusText?` : État de la requête (similaire à error)
426
+ * • `error?` : Erreur lors de la récupération des utilisateurs
427
+ * • `result?` La liste des utilisateurs.
428
+ * > • `id` Un identifiant qui identifie l'utilisateur.
429
+ * > • `login` Le nom d'affichage de l'utilisateur.
430
+ * > • `type` Le type d'utilisateur.
431
+ * > • `broadcaster_type` Le type de diffuseur.
432
+ * > • `description` La description de l'utilisateur sur sa chaîne.
433
+ * > • `profile_image_url` Une URL vers l'image de profil de l'utilisateur.
434
+ * > • `offline_image_url` Une URL vers l'image hors ligne de l'utilisateur.
435
+ * > • `view_count` **REMARQUE** : ce champ est obsolète (voir [Point de terminaison de l'API Get Users – Dépréciation de « view_count »)](https://discuss.dev.twitch.tv/t/get-users-api -endpoint-view-count-deprecation/37777)). Toutes les données contenues dans ce champ ne sont pas valides et ne doivent pas être utilisées.
436
+ * > • `created_at` La date et l'heure UTC auxquelles le compte de l'utilisateur a été créé. L'horodatage est au format RFC3339.
437
+ *
438
+ * ---
439
+ * @example
440
+ client.getUsers(["twitchdev"]).then(console.log);
441
+ */
442
+ async getUsers(usernames) {
337
443
 
338
- };
339
- /**
340
- * 👀 **Renvoi les informations d'un ou plusieurs utilisateur(s)**
341
- *
342
- * ---
343
- * @param {Array<string>} usernames Les noms d'utilisateur des utilisateurs à obtenir. Le nombre maximum de noms d'utilisateur que vous pouvez spécifier est de 100.
344
- *
345
- * ---
346
- * @returns {Promise<{
347
- * ok:boolean,
348
- * statusText?:string,
349
- * result?:Array<{
350
- * id:string,
351
- * display_name:string,
352
- * broadcaster_type:""|"affiliate"|"partner",
353
- * description:string,
354
- * profile_image_url:string,
355
- * offline_image_url:string,
356
- * view_count:number,
357
- * created_at:string
358
- * }>
359
- * }>} **Renvoi une promesse d'objet** :
360
- *
361
- * • `ok` : État de la requête (true ou false)
362
- * • `statusText?` : État de la requête (similaire à error)
363
- * • `error?` : Erreur lors de la récupération des utilisateurs
364
- * • `result?` La liste des utilisateurs.
365
- * > • `id` Un identifiant qui identifie l'utilisateur.
366
- * > • `login` Le nom d'affichage de l'utilisateur.
367
- * > • `type` Le type d'utilisateur.
368
- * > • `broadcaster_type` Le type de diffuseur.
369
- * > • `description` La description de l'utilisateur sur sa chaîne.
370
- * > • `profile_image_url` Une URL vers l'image de profil de l'utilisateur.
371
- * > • `offline_image_url` Une URL vers l'image hors ligne de l'utilisateur.
372
- * > • `view_count` **REMARQUE** : ce champ est obsolète (voir [Point de terminaison de l'API Get Users – Dépréciation de « view_count »)](https://discuss.dev.twitch.tv/t/get-users-api -endpoint-view-count-deprecation/37777)). Toutes les données contenues dans ce champ ne sont pas valides et ne doivent pas être utilisées.
373
- * > • `created_at` La date et l'heure UTC auxquelles le compte de l'utilisateur a été créé. L'horodatage est au format RFC3339.
374
- *
375
- * ---
376
- * @example
377
- client.getUsers(["twitchdev"]).then(console.log);
378
- */
379
- this.getUsers = async (usernames) => {
444
+ try {
380
445
 
381
446
  const map = usernames.splice(0, 100).join('&login=');
382
447
  const link = `https://api.twitch.tv/helix/users?login=${map}`;
383
-
448
+
384
449
  if (this.isExpiredToken()) {
385
450
  await this.refreshToken();
386
451
  }
387
-
452
+
388
453
  const _ = await fetch(link, {
389
454
  method:"GET",
390
455
  headers:{
@@ -392,367 +457,288 @@ module.exports = class {
392
457
  "Client-Id":this.clientId,
393
458
  },
394
459
  });
395
-
460
+
396
461
  if (!_.ok) {
397
462
  return { ok:false, statusText:_.statusText };
398
463
  }
399
-
464
+
400
465
  const result = await _.json();
401
466
  return { ok:true, result:result.data };
402
467
 
403
- };
404
- /**
405
- * 👀 **Renvoi une liste de Cheermotes que les utilisateurs peuvent utiliser pour encourager Bits dans la salle de discussion de n'importe quelle chaîne compatible Bits.**
406
- * 💡 **Note** : Les cheermotes sont des émoticônes animées auxquelles les spectateurs peuvent attribuer des Bits.
407
- *
408
- * ---
409
- * @returns {Promise<{
410
- * ok:boolean,
411
- * statusText?:string,
412
- * error?:string,
413
- * result?:Array<{
414
- * prefix:string,
415
- * tiers:Array<{
416
- * min_bits:number,
417
- * id:"1"|"100"|"500"|"1000"|"5000"|"10000"|"100000",
418
- * color:string,
419
- * images:{
420
- * dark:{
421
- * animated:{
422
- * "1":string,
423
- * "1.5":string,
424
- * "2":string,
425
- * "3":string,
426
- * "4":string,
427
- * },
428
- * static:{
429
- * "1":string,
430
- * "1.5":string,
431
- * "2":string,
432
- * "3":string,
433
- * "4":string,
434
- * },
435
- * },
436
- * light:{
437
- * animated:{
438
- * "1":string,
439
- * "1.5":string,
440
- * "2":string,
441
- * "3":string,
442
- * "4":string,
443
- * },
444
- * static:{
445
- * "1":string,
446
- * "1.5":string,
447
- * "2":string,
448
- * "3":string,
449
- * "4":string,
450
- * },
451
- * },
452
- * },
453
- * can_cheer:boolean,
454
- * show_in_bits_card:boolean,
455
- * }>,
456
- * type:"global_first_party"|"global_third_party"|"channel_custom"|"display_only"|"sponsored",
457
- * order:number,
458
- * last_updated:string,
459
- * is_charitable:boolean,
460
- * }>
461
- * }>} **Renvoi une promesse d'objet** :
462
- *
463
- * • `ok` : État de la requête (true ou false)
464
- * • `statusText?` : État de la requête (similaire à error)
465
- * • `error?` : Erreur lors de la récupération des cheermotes
466
- * • `result ?` La liste des Cheermotes. La liste est classée par ordre croissant de la valeur du champ de commande.
467
- * > • `prefix` La partie nom de la chaîne Cheermote que vous utilisez dans le chat pour encourager Bits. La chaîne Cheermote complète est la concaténation de {préfixe} + {nombre de bits}. Par exemple, si le préfixe est « Cheer » et que vous souhaitez encourager 100 bits, la chaîne Cheermote complète est Cheer100. Lorsque la chaîne Cheermote est saisie dans le chat, Twitch la convertit en l'image associée au niveau Bits qui a été acclamé.
468
- * > • `tiers`
469
- * > > • `min_bits` Le nombre minimum de Bits que vous devez encourager à ce niveau. Le nombre maximum de Bits que vous pouvez encourager à ce niveau est déterminé par le nombre minimum de Bits requis du niveau suivant moins 1. Par exemple, si min_bits est 1 et min_bits pour le niveau suivant est 100, la plage de Bits pour ce niveau. est compris entre 1 et 99. La valeur minimale de bits du dernier niveau est le nombre maximum de bits que vous pouvez encourager en utilisant ce Cheermote. Par exemple, 10 000.
470
- * > > • `id` Le niveau.
471
- * > > • `color` Le code hexadécimal de la couleur associée à ce niveau (par exemple, #979797).
472
- * > > • `images` Les ensembles d'images animées et statiques pour le Cheermote. Le dictionnaire d'images est organisé par thème, format et taille. Les touches de thème sont sombres et claires. Chaque thème est un dictionnaire de formats : animés et statiques. Chaque format est un dictionnaire de tailles : 1, 1,5, 2, 3 et 4. La valeur de chaque taille contient l'URL de l'image.
473
- * > > • `can_cheer` Une valeur booléenne qui détermine si les utilisateurs peuvent encourager à ce niveau.
474
- * > > • `show_in_bits_card` Une valeur booléenne qui détermine si ce niveau est affiché dans la carte Bits. Est vrai si ce niveau est affiché dans la carte Bits.
475
- *
476
- * > • `type` Le type de Cheermote.
477
- * > • `order` L'ordre dans lequel les Cheermotes sont affichés dans la carte Bits. Les numéros ne peuvent pas être consécutifs. Par exemple, les nombres peuvent passer de 1 à 7 puis à 13. Les numéros de commande sont uniques au sein d'un type de Cheermote (par exemple, global_first_party) mais peuvent ne pas être uniques parmi tous les Cheermotes de la réponse.
478
- * > • `last_updated` La date et l'heure, au format RFC3339, de la dernière mise à jour de ce Cheermote.
479
- * > • `is_charitable` Une valeur booléenne qui indique si ce Cheermote fournit une contribution caritative lors des campagnes caritatives.
480
- *
481
- * ---
482
- * @example
483
- client.getCheermotes().then(console.log);
484
- */
485
- this.getCheermotes = async () => {
486
-
487
- try {
488
-
489
- const link = "https://api.twitch.tv/helix/bits/cheermotes";
490
-
491
- if (this.isExpiredToken()) {
492
- await this.refreshToken();
493
- }
468
+ }
469
+ catch (error) {
470
+ return { ok:false, error:error.stack };
471
+ }
494
472
 
495
- const _ = await fetch(link, {
496
- method:"GET",
497
- headers:{
498
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
499
- "Client-Id":this.clientId,
500
- },
501
- });
502
-
503
- if (!_.ok) {
504
- return { ok:false, statusText:_.statusText };
505
- }
473
+ }
474
+ /**
475
+ * 👀 **Renvoi une liste de Cheermotes que les utilisateurs peuvent utiliser pour encourager Bits dans la salle de discussion de n'importe quelle chaîne compatible Bits.**
476
+ * 💡 **Note** : Les cheermotes sont des émoticônes animées auxquelles les spectateurs peuvent attribuer des Bits.
477
+ *
478
+ * ---
479
+ * @returns {Promise<{
480
+ * ok:boolean,
481
+ * statusText?:string,
482
+ * error?:string,
483
+ * result?:Array<{
484
+ * prefix:string,
485
+ * tiers:Array<{
486
+ * min_bits:number,
487
+ * id:"1"|"100"|"500"|"1000"|"5000"|"10000"|"100000",
488
+ * color:string,
489
+ * images:{
490
+ * dark:{
491
+ * animated:{
492
+ * "1":string,
493
+ * "1.5":string,
494
+ * "2":string,
495
+ * "3":string,
496
+ * "4":string,
497
+ * },
498
+ * static:{
499
+ * "1":string,
500
+ * "1.5":string,
501
+ * "2":string,
502
+ * "3":string,
503
+ * "4":string,
504
+ * },
505
+ * },
506
+ * light:{
507
+ * animated:{
508
+ * "1":string,
509
+ * "1.5":string,
510
+ * "2":string,
511
+ * "3":string,
512
+ * "4":string,
513
+ * },
514
+ * static:{
515
+ * "1":string,
516
+ * "1.5":string,
517
+ * "2":string,
518
+ * "3":string,
519
+ * "4":string,
520
+ * },
521
+ * },
522
+ * },
523
+ * can_cheer:boolean,
524
+ * show_in_bits_card:boolean,
525
+ * }>,
526
+ * type:"global_first_party"|"global_third_party"|"channel_custom"|"display_only"|"sponsored",
527
+ * order:number,
528
+ * last_updated:string,
529
+ * is_charitable:boolean,
530
+ * }>
531
+ * }>} **Renvoi une promesse d'objet** :
532
+ *
533
+ * • `ok` : État de la requête (true ou false)
534
+ * • `statusText?` : État de la requête (similaire à error)
535
+ * • `error?` : Erreur lors de la récupération des cheermotes
536
+ * • `result ?` La liste des Cheermotes. La liste est classée par ordre croissant de la valeur du champ de commande.
537
+ * > • `prefix` La partie nom de la chaîne Cheermote que vous utilisez dans le chat pour encourager Bits. La chaîne Cheermote complète est la concaténation de {préfixe} + {nombre de bits}. Par exemple, si le préfixe est « Cheer » et que vous souhaitez encourager 100 bits, la chaîne Cheermote complète est Cheer100. Lorsque la chaîne Cheermote est saisie dans le chat, Twitch la convertit en l'image associée au niveau Bits qui a été acclamé.
538
+ * > • `tiers`
539
+ * > > • `min_bits` Le nombre minimum de Bits que vous devez encourager à ce niveau. Le nombre maximum de Bits que vous pouvez encourager à ce niveau est déterminé par le nombre minimum de Bits requis du niveau suivant moins 1. Par exemple, si min_bits est 1 et min_bits pour le niveau suivant est 100, la plage de Bits pour ce niveau. est compris entre 1 et 99. La valeur minimale de bits du dernier niveau est le nombre maximum de bits que vous pouvez encourager en utilisant ce Cheermote. Par exemple, 10 000.
540
+ * > > • `id` Le niveau.
541
+ * > > • `color` Le code hexadécimal de la couleur associée à ce niveau (par exemple, #979797).
542
+ * > > • `images` Les ensembles d'images animées et statiques pour le Cheermote. Le dictionnaire d'images est organisé par thème, format et taille. Les touches de thème sont sombres et claires. Chaque thème est un dictionnaire de formats : animés et statiques. Chaque format est un dictionnaire de tailles : 1, 1,5, 2, 3 et 4. La valeur de chaque taille contient l'URL de l'image.
543
+ * > > • `can_cheer` Une valeur booléenne qui détermine si les utilisateurs peuvent encourager à ce niveau.
544
+ * > > • `show_in_bits_card` Une valeur booléenne qui détermine si ce niveau est affiché dans la carte Bits. Est vrai si ce niveau est affiché dans la carte Bits.
545
+ *
546
+ * > • `type` Le type de Cheermote.
547
+ * > • `order` L'ordre dans lequel les Cheermotes sont affichés dans la carte Bits. Les numéros ne peuvent pas être consécutifs. Par exemple, les nombres peuvent passer de 1 à 7 puis à 13. Les numéros de commande sont uniques au sein d'un type de Cheermote (par exemple, global_first_party) mais peuvent ne pas être uniques parmi tous les Cheermotes de la réponse.
548
+ * > • `last_updated` La date et l'heure, au format RFC3339, de la dernière mise à jour de ce Cheermote.
549
+ * > • `is_charitable` Une valeur booléenne qui indique si ce Cheermote fournit une contribution caritative lors des campagnes caritatives.
550
+ *
551
+ * ---
552
+ * @example
553
+ client.getCheermotes().then(console.log);
554
+ */
555
+ async getCheermotes() {
556
+
557
+ try {
506
558
 
507
- const result = await _.json();
508
- return { ok:true, result:result.data };
559
+ const link = "https://api.twitch.tv/helix/bits/cheermotes";
509
560
 
561
+ if (this.isExpiredToken()) {
562
+ await this.refreshToken();
510
563
  }
511
564
 
512
- catch (error) {
513
- return { ok:false, error:error.stack };
565
+ const _ = await fetch(link, {
566
+ method:"GET",
567
+ headers:{
568
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
569
+ "Client-Id":this.clientId,
570
+ },
571
+ });
572
+
573
+ if (!_.ok) {
574
+ return { ok:false, statusText:_.statusText };
514
575
  }
515
576
 
516
- };
517
- /**
518
- * 👀 **Obtient la liste des [émotes globales](https://www.twitch.tv/creatorcamp/fr-fr/paths/getting-started-on-twitch/emotes/) ou la liste des émotes personnalisées du diffuseur.**
519
- * 💡 **Note** : Les émotes globales sont des émoticônes créées par Twitch que les utilisateurs peuvent utiliser dans n'importe quel chat Twitch.
520
- * Les diffuseurs créent ces émotes personnalisées pour les utilisateurs qui s'abonnent ou suivent la chaîne ou encouragent Bits dans la fenêtre de discussion de la chaîne. [En savoir plus](https://dev.twitch.tv/docs/irc/emotes/).
521
- * 💡 **Note** : À l'exception des émoticônes personnalisées, les utilisateurs peuvent utiliser des émoticônes personnalisées dans n'importe quel chat Twitch.
522
- *
523
- * ---
524
- * @param {string} [username] Le nom d'utilisateur qui identifie le diffuseur dont vous souhaitez obtenir les émoticônes.
525
- *
526
- * ---
527
- * @returns {Promise<{
528
- * ok:boolean,
529
- * statusText?:string,
530
- * error?:string,
531
- * result?:Array<{
532
- * id:string,
533
- * name:string,
534
- * images:{
535
- * url_1x:string,
536
- * url_2x:string,
537
- * url_4x:string,
538
- * },
539
- * tier?:string,
540
- * emote_type?:"bitstier"|"follower"|"subscriptions",
541
- * emote_set_id?:string,
542
- * format:Array<"static"|"animated">,
543
- * scale:Array<"1.0"|"2.0"|"3.0">,
544
- * theme_mode:Array<"dark"|"light">,
545
- * template:string,
546
- * }>
547
- * }>} **Renvoi une promesse d'objet** :
548
- *
549
- * • `ok` : État de la requête (true ou false)
550
- * • `statusText?` : État de la requête (similaire à error)
551
- * • `error?` : Erreur lors de la récupération des emotes
552
- * • `result?` La liste des émoticônes globales. ou la liste des émoticônes créées par le diffuseur spécifié. Si le diffuseur n’a pas créé d’émoticônes personnalisées, la liste est vide.
553
- * > • `id` Un identifiant qui identifie cette emote.
554
- * > • `name` Le nom de l'emote. Il s'agit du nom que les téléspectateurs saisissent dans la fenêtre de discussion pour faire apparaître l'émote.
555
- * > • `images` Les URL des images pour l'emote. Ces URL d’images fournissent toujours une image d’émoticône statique et non animée avec un arrière-plan clair. **Note** : Vous devez utiliser l'URL modélisée dans le champ du modèle pour récupérer l'image au lieu d'utiliser ces URL.
556
- * > > • `url_1x` Une URL vers la petite version (28px x 28px) de l'emote.
557
- * > > • `url_2x` Une URL vers la version moyenne (56px x 56px) de l'emote.
558
- * > > • `url_4x` Une URL vers la grande version (112px x 112px) de l'emote.
559
- *
560
- * > • `tier?` Le niveau d'abonné auquel l'emote est déverrouillée. Ce champ contient les informations de niveau uniquement si emote_type est défini sur abonnements, sinon il s'agit d'une chaîne vide.
561
- * > • `emote_type?` Le type d'emote.
562
- * > • `emote_set_id?` Un identifiant qui identifie l'ensemble d'émotes auquel appartient l'émote.
563
- * > • `format` Les formats dans lesquels l'émote est disponible. Par exemple, si l'émote est disponible uniquement au format PNG statique, le tableau ne contient que du statique. Mais si l'emote est disponible sous forme de PNG statique et de GIF animé, le tableau contient des éléments statiques et animés.
564
- * > • `scale` Les tailles dans lesquelles l'emote est disponible. Par exemple, si l'emote est disponible en petites et moyennes tailles, le tableau contient 1.0 et 2.0.
565
- * > • `theme_mode` Les thèmes d'arrière-plan dans lesquels l'emote est disponible.
566
- * > • `template` Une URL basée sur un modèle. Utilisez les valeurs des champs id, format, scale et theme_mode pour remplacer les chaînes d'espace réservé de même nom dans l'URL modélisée afin de créer une URL CDN (réseau de diffusion de contenu) que vous utilisez pour récupérer l'emote. Pour plus d'informations sur l'apparence du modèle et comment l'utiliser pour récupérer des émoticônes, consultez [Format d'URL Emote CDN](https://dev.twitch.tv/docs/irc/emotes/#cdn-template). Vous devez utiliser ce modèle au lieu d'utiliser les URL dans l'objet images.
567
- *
568
- * ---
569
- * @example
570
- client.getChatEmotes().then(console.log); // Obtient toutes les émoticônes globales.
571
- client.getChatEmotes("twitchdev").then(console.log); // Obtient les émoticônes personnalisées créées par la chaîne TwitchDev.
572
- */
573
- this.getChatEmotes = async (username) => {
574
-
575
- try {
576
-
577
- let link = `https://api.twitch.tv/helix/chat/emotes/global`;
578
-
579
- if (username) {
580
-
581
- const user = await this.getUsers([username]);
582
-
583
- if (!user.ok) {
584
- return { ok:false, error:user.error ?? user.statusText };
585
- }
577
+ const result = await _.json();
578
+ return { ok:true, result:result.data };
586
579
 
587
- const broadcaster_id = user.result[0]?.id;
580
+ }
581
+ catch (error) {
582
+ return { ok:false, error:error.stack };
583
+ }
584
+
585
+ }
586
+ /**
587
+ * 👀 **Obtient la liste des [émotes globales](https://www.twitch.tv/creatorcamp/fr-fr/paths/getting-started-on-twitch/emotes/) ou la liste des émotes personnalisées du diffuseur.**
588
+ * 💡 **Note** : Les émotes globales sont des émoticônes créées par Twitch que les utilisateurs peuvent utiliser dans n'importe quel chat Twitch.
589
+ * Les diffuseurs créent ces émotes personnalisées pour les utilisateurs qui s'abonnent ou suivent la chaîne ou encouragent Bits dans la fenêtre de discussion de la chaîne. [En savoir plus](https://dev.twitch.tv/docs/irc/emotes/).
590
+ * 💡 **Note** : À l'exception des émoticônes personnalisées, les utilisateurs peuvent utiliser des émoticônes personnalisées dans n'importe quel chat Twitch.
591
+ *
592
+ * ---
593
+ * @param {string} [username] Le nom d'utilisateur qui identifie le diffuseur dont vous souhaitez obtenir les émoticônes.
594
+ *
595
+ * ---
596
+ * @returns {Promise<{
597
+ * ok:boolean,
598
+ * statusText?:string,
599
+ * error?:string,
600
+ * result?:Array<{
601
+ * id:string,
602
+ * name:string,
603
+ * images:{
604
+ * url_1x:string,
605
+ * url_2x:string,
606
+ * url_4x:string,
607
+ * },
608
+ * tier?:string,
609
+ * emote_type?:"bitstier"|"follower"|"subscriptions",
610
+ * emote_set_id?:string,
611
+ * format:Array<"static"|"animated">,
612
+ * scale:Array<"1.0"|"2.0"|"3.0">,
613
+ * theme_mode:Array<"dark"|"light">,
614
+ * template:string,
615
+ * }>
616
+ * }>} **Renvoi une promesse d'objet** :
617
+ *
618
+ * • `ok` : État de la requête (true ou false)
619
+ * • `statusText?` : État de la requête (similaire à error)
620
+ * • `error?` : Erreur lors de la récupération des emotes
621
+ * • `result?` La liste des émoticônes globales. ou la liste des émoticônes créées par le diffuseur spécifié. Si le diffuseur n’a pas créé d’émoticônes personnalisées, la liste est vide.
622
+ * > • `id` Un identifiant qui identifie cette emote.
623
+ * > • `name` Le nom de l'emote. Il s'agit du nom que les téléspectateurs saisissent dans la fenêtre de discussion pour faire apparaître l'émote.
624
+ * > • `images` Les URL des images pour l'emote. Ces URL d’images fournissent toujours une image d’émoticône statique et non animée avec un arrière-plan clair. **Note** : Vous devez utiliser l'URL modélisée dans le champ du modèle pour récupérer l'image au lieu d'utiliser ces URL.
625
+ * > > • `url_1x` Une URL vers la petite version (28px x 28px) de l'emote.
626
+ * > > • `url_2x` Une URL vers la version moyenne (56px x 56px) de l'emote.
627
+ * > > • `url_4x` Une URL vers la grande version (112px x 112px) de l'emote.
628
+ *
629
+ * > • `tier?` Le niveau d'abonné auquel l'emote est déverrouillée. Ce champ contient les informations de niveau uniquement si emote_type est défini sur abonnements, sinon il s'agit d'une chaîne vide.
630
+ * > • `emote_type?` Le type d'emote.
631
+ * > • `emote_set_id?` Un identifiant qui identifie l'ensemble d'émotes auquel appartient l'émote.
632
+ * > • `format` Les formats dans lesquels l'émote est disponible. Par exemple, si l'émote est disponible uniquement au format PNG statique, le tableau ne contient que du statique. Mais si l'emote est disponible sous forme de PNG statique et de GIF animé, le tableau contient des éléments statiques et animés.
633
+ * > • `scale` Les tailles dans lesquelles l'emote est disponible. Par exemple, si l'emote est disponible en petites et moyennes tailles, le tableau contient 1.0 et 2.0.
634
+ * > • `theme_mode` Les thèmes d'arrière-plan dans lesquels l'emote est disponible.
635
+ * > • `template` Une URL basée sur un modèle. Utilisez les valeurs des champs id, format, scale et theme_mode pour remplacer les chaînes d'espace réservé de même nom dans l'URL modélisée afin de créer une URL CDN (réseau de diffusion de contenu) que vous utilisez pour récupérer l'emote. Pour plus d'informations sur l'apparence du modèle et comment l'utiliser pour récupérer des émoticônes, consultez [Format d'URL Emote CDN](https://dev.twitch.tv/docs/irc/emotes/#cdn-template). Vous devez utiliser ce modèle au lieu d'utiliser les URL dans l'objet images.
636
+ *
637
+ * ---
638
+ * @example
639
+ client.getChatEmotes().then(console.log); // Obtient toutes les émoticônes globales.
640
+ client.getChatEmotes("twitchdev").then(console.log); // Obtient les émoticônes personnalisées créées par la chaîne TwitchDev.
641
+ */
642
+ async getChatEmotes(username) {
588
643
 
589
- link = `https://api.twitch.tv/helix/chat/emotes/?broadcaster_id=${broadcaster_id}`;
644
+ try {
590
645
 
591
- }
646
+ let link = `https://api.twitch.tv/helix/chat/emotes/global`;
592
647
 
593
- if (this.isExpiredToken()) {
594
- await this.refreshToken();
595
- }
648
+ if (username) {
596
649
 
597
- const _ = await fetch(link, {
598
- method:"GET",
599
- headers:{
600
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
601
- "Client-Id":this.clientId,
602
- },
603
- });
650
+ const user = await this.getUsers([username]);
604
651
 
605
- if (!_.ok) {
606
- return { ok:false, statusText:_.statusText };
652
+ if (!user.ok) {
653
+ return { ok:false, error:user.error ?? user.statusText };
607
654
  }
608
655
 
609
- const result = await _.json();
610
- return { ok:true, result:result.data };
656
+ const broadcaster_id = user.result[0]?.id;
611
657
 
612
- }
658
+ link = `https://api.twitch.tv/helix/chat/emotes/?broadcaster_id=${broadcaster_id}`;
613
659
 
614
- catch (error) {
615
- return { ok:false, error:error.stack };
616
660
  }
617
661
 
618
- };
619
- /**
620
- * 👀 **Obtient la liste des badges de discussion de Twitch, que les utilisateurs peuvent utiliser dans la salle de discussion de n'importe quelle chaîne, ou la liste des badges de discussion personnalisés du diffuseur.**
621
- * 💡 **Note** : Pour plus d'informations sur les badges de chat, consultez le [Guide des badges de chat Twitch](https://help.twitch.tv/s/article/twitch-chat-badges-guide?langue=en_US).
622
- * 💡 **Note** : La liste est vide si le diffuseur n'a pas créé de badges de discussion personnalisés. Pour plus d'informations sur les badges personnalisés, consultez [badges d'abonné](https://help.twitch.tv/s/article/subscriber-badge-guide?langue=en_US) et [badges Bits](https://help.twitch. tv/s/article/custom-bit-badges-guide?langue=en_US).
623
- *
624
- * ---
625
- * @param {string} [username] Le nom d'utilisateur
626
- *
627
- * ---
628
- * @returns {Promise<{
629
- * ok:boolean,
630
- * statusText?:string,
631
- * error?:string,
632
- * result?:Array<{
633
- * set_id:string,
634
- * versions:Array<{
635
- * id:string,
636
- * image_url_1x:string,
637
- * image_url_2x:string,
638
- * image_url_4x:string,
639
- * title:string,
640
- * description:string,
641
- * click_action:string|null,
642
- * click_url:string|null,
643
- * }>
644
- * }>
645
- * }>} **Renvoi une promesse d'objet** :
646
- *
647
- * • `ok` : État de la requête (true ou false)
648
- * • `statusText?` : État de la requête (similaire à error)
649
- * • `error?` : Erreur lors de la récupération des badges
650
- * • `result?` La liste des badges de chat. La liste est triée par ordre croissant par set_id, et au sein d'un ensemble, la liste est triée par ordre croissant par id.
651
- * > • `set_id` Un identifiant qui identifie cet ensemble de badges de discussion. Par exemple, Bits ou Abonné.
652
- * > • `versions` La liste des badges de discussion dans cet ensemble.
653
- * > > • `id` Un identifiant qui identifie cette version du badge. L'ID peut être n'importe quelle valeur. Par exemple, pour Bits, l'ID correspond au niveau de Bits, mais pour World of Warcraft, il peut s'agir d'Alliance ou de Horde.
654
- * > > • `image_url_1x` Une URL vers la petite version (18px x 18px) du badge.
655
- * > > • `image_url_2x` Une URL vers la version moyenne (36px x 36px) du badge.
656
- * > > • `image_url_4x` Une URL vers la version grande (72px x 72px) du badge.
657
- * > > • `title` Le titre du badge.
658
- * > > • `description` La description du badge.
659
- * > > • `click_action` L'action à entreprendre en cliquant sur le badge. Défini sur null si aucune action n'est spécifiée.
660
- * > > • `click_url` L'URL vers laquelle accéder lorsque vous cliquez sur le badge. Défini sur null si aucune URL n'est spécifiée.
661
- *
662
- * ---
663
- * @example
664
- client.getChatBadges().then(console.log); // Obtient la liste des badges de discussion globaux.
665
- client.getChatBadges("twitchdev").then(console.log); // Obtenez la liste des badges de discussion personnalisés créés par la chaîne TwitchDev Twitch.
666
- */
667
- this.getChatBadges = async (username) => {
668
-
669
- try {
670
-
671
- let link = `https://api.twitch.tv/helix/chat/badges/global`;
672
-
673
- if (username) {
674
-
675
- const user = await this.getUsers([username]);
676
-
677
- if (!user.ok) {
678
- return { ok:false, error:user.error ?? user.statusText };
679
- }
680
-
681
- const broadcaster_id = user.result[0]?.id;
682
-
683
- link = `https://api.twitch.tv/helix/chat/badges/?broadcaster_id=${broadcaster_id}`;
662
+ if (this.isExpiredToken()) {
663
+ await this.refreshToken();
664
+ }
684
665
 
685
- }
666
+ const _ = await fetch(link, {
667
+ method:"GET",
668
+ headers:{
669
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
670
+ "Client-Id":this.clientId,
671
+ },
672
+ });
686
673
 
687
- if (this.isExpiredToken()) {
688
- await this.refreshToken();
689
- }
674
+ if (!_.ok) {
675
+ return { ok:false, statusText:_.statusText };
676
+ }
690
677
 
691
- const _ = await fetch(link, {
692
- method:"GET",
693
- headers:{
694
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
695
- "Client-Id":this.clientId,
696
- },
697
- });
678
+ const result = await _.json();
679
+ return { ok:true, result:result.data };
698
680
 
699
- if (!_.ok) {
700
- return { ok:false, statusText:_.statusText };
701
- }
681
+ }
682
+ catch (error) {
683
+ return { ok:false, error:error.stack };
684
+ }
702
685
 
703
- const result = await _.json();
704
- return { ok:true, result:result.data };
686
+ }
687
+ /**
688
+ * 👀 **Obtient la liste des badges de discussion de Twitch, que les utilisateurs peuvent utiliser dans la salle de discussion de n'importe quelle chaîne, ou la liste des badges de discussion personnalisés du diffuseur.**
689
+ * 💡 **Note** : Pour plus d'informations sur les badges de chat, consultez le [Guide des badges de chat Twitch](https://help.twitch.tv/s/article/twitch-chat-badges-guide?langue=en_US).
690
+ * 💡 **Note** : La liste est vide si le diffuseur n'a pas créé de badges de discussion personnalisés. Pour plus d'informations sur les badges personnalisés, consultez [badges d'abonné](https://help.twitch.tv/s/article/subscriber-badge-guide?langue=en_US) et [badges Bits](https://help.twitch. tv/s/article/custom-bit-badges-guide?langue=en_US).
691
+ *
692
+ * ---
693
+ * @param {string} [username] Le nom d'utilisateur
694
+ *
695
+ * ---
696
+ * @returns {Promise<{
697
+ * ok:boolean,
698
+ * statusText?:string,
699
+ * error?:string,
700
+ * result?:Array<{
701
+ * set_id:string,
702
+ * versions:Array<{
703
+ * id:string,
704
+ * image_url_1x:string,
705
+ * image_url_2x:string,
706
+ * image_url_4x:string,
707
+ * title:string,
708
+ * description:string,
709
+ * click_action:string|null,
710
+ * click_url:string|null,
711
+ * }>
712
+ * }>
713
+ * }>} **Renvoi une promesse d'objet** :
714
+ *
715
+ * • `ok` : État de la requête (true ou false)
716
+ * • `statusText?` : État de la requête (similaire à error)
717
+ * • `error?` : Erreur lors de la récupération des badges
718
+ * • `result?` La liste des badges de chat. La liste est triée par ordre croissant par set_id, et au sein d'un ensemble, la liste est triée par ordre croissant par id.
719
+ * > • `set_id` Un identifiant qui identifie cet ensemble de badges de discussion. Par exemple, Bits ou Abonné.
720
+ * > • `versions` La liste des badges de discussion dans cet ensemble.
721
+ * > > • `id` Un identifiant qui identifie cette version du badge. L'ID peut être n'importe quelle valeur. Par exemple, pour Bits, l'ID correspond au niveau de Bits, mais pour World of Warcraft, il peut s'agir d'Alliance ou de Horde.
722
+ * > > • `image_url_1x` Une URL vers la petite version (18px x 18px) du badge.
723
+ * > > • `image_url_2x` Une URL vers la version moyenne (36px x 36px) du badge.
724
+ * > > • `image_url_4x` Une URL vers la version grande (72px x 72px) du badge.
725
+ * > > • `title` Le titre du badge.
726
+ * > > • `description` La description du badge.
727
+ * > > • `click_action` L'action à entreprendre en cliquant sur le badge. Défini sur null si aucune action n'est spécifiée.
728
+ * > > • `click_url` L'URL vers laquelle accéder lorsque vous cliquez sur le badge. Défini sur null si aucune URL n'est spécifiée.
729
+ *
730
+ * ---
731
+ * @example
732
+ client.getChatBadges().then(console.log); // Obtient la liste des badges de discussion globaux.
733
+ client.getChatBadges("twitchdev").then(console.log); // Obtenez la liste des badges de discussion personnalisés créés par la chaîne TwitchDev Twitch.
734
+ */
735
+ async getChatBadges(username) {
705
736
 
706
- }
737
+ try {
707
738
 
708
- catch (error) {
709
- return { ok:false, error:error.stack };
710
- }
739
+ let link = `https://api.twitch.tv/helix/chat/badges/global`;
711
740
 
712
- };
713
- /**
714
- * 👀 **Renvoi les paramètres de discussion du diffuseur**
715
- *
716
- * ---
717
- * @param {string} username Le nom d'utilisateur du diffuseur dont vous souhaitez obtenir les paramètres de discussion.
718
- *
719
- * ---
720
- * @returns {Promise<{
721
- * ok:boolean,
722
- * statusText?:string,
723
- * error?:string,
724
- * result?:Array<{
725
- * broadcaster_id:string,
726
- * emote_mode:boolean,
727
- * follower_mode:boolean,
728
- * follower_mode_duration:number|null,
729
- * slow_mode:boolean,
730
- * slow_mode_wait_time:number|null,
731
- * subscriber_mode:boolean,
732
- * unique_chat_mode:boolean,
733
- * }>
734
- * }>} **Renvoi une promesse d'objet** :
735
- *
736
- * • `ok` : État de la requête (true ou false)
737
- * • `statusText?` : État de la requête (similaire à error)
738
- * • `error?` : Erreur lors de la récupération des paramètres
739
- * • `result?` La liste des paramètres de discussion. La liste contient un seul objet avec tous les paramètres.
740
- * > • `broadcaster_id` L'ID du diffuseur spécifié dans la requête.
741
- * > • `emote_mode` Une valeur booléenne qui détermine si les messages de discussion doivent contenir uniquement des émoticônes. Est vrai si les messages de discussion ne peuvent contenir que des émoticônes ; sinon, faux.
742
- * > • `follower_mode` Une valeur booléenne qui détermine si le diffuseur restreint la salle de discussion aux abonnés uniquement. Est vrai si le diffuseur restreint la salle de discussion aux abonnés uniquement ; sinon, faux. Consultez le champ follower_mode_duration pour connaître la durée pendant laquelle les utilisateurs doivent suivre le diffuseur avant de pouvoir participer au salon de discussion.
743
- * > • `follower_mode_duration` La durée, en minutes, pendant laquelle les utilisateurs doivent suivre le diffuseur avant de pouvoir participer au salon de discussion. Est nul si follower_mode est faux.
744
- * > • `slow_mode` Une valeur booléenne qui détermine si le diffuseur limite la fréquence à laquelle les utilisateurs de la salle de discussion sont autorisés à envoyer des messages. Est vrai si le diffuseur applique un délai ; sinon, faux. Voir le champ slow_mode_wait_time pour le délai.
745
- * > • `slow_mode_wait_time` Le temps, en secondes, pendant lequel les utilisateurs doivent attendre entre l'envoi de messages. Est nul si slow_mode est faux.
746
- * > • `subscriber_mode` Une valeur booléenne qui détermine si seuls les utilisateurs abonnés à la chaîne du diffuseur peuvent parler dans la salle de discussion. Est vrai si le diffuseur restreint le salon de discussion aux abonnés uniquement ; sinon, faux.
747
- * > • `unique_chat_mode` Une valeur booléenne qui détermine si le diffuseur demande aux utilisateurs de publier uniquement des messages uniques dans la salle de discussion. Est vrai si le diffuseur exige uniquement des messages uniques ; sinon, faux.
748
- *
749
- * ---
750
- * @example
751
- client.getChatSettings("twitchdev").then(console.log);
752
- */
753
- this.getChatSettings = async (username) => {
754
-
755
- try {
741
+ if (username) {
756
742
 
757
743
  const user = await this.getUsers([username]);
758
744
 
@@ -762,559 +748,633 @@ module.exports = class {
762
748
 
763
749
  const broadcaster_id = user.result[0]?.id;
764
750
 
765
- const link = `https://api.twitch.tv/helix/chat/settings/?broadcaster_id=${broadcaster_id}`;
751
+ link = `https://api.twitch.tv/helix/chat/badges/?broadcaster_id=${broadcaster_id}`;
766
752
 
767
- if (this.isExpiredToken()) {
768
- await this.refreshToken();
769
- }
753
+ }
754
+
755
+ if (this.isExpiredToken()) {
756
+ await this.refreshToken();
757
+ }
770
758
 
771
- const _ = await fetch(link, {
772
- method:"GET",
773
- headers:{
774
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
775
- "Client-Id":this.clientId,
776
- },
777
- });
759
+ const _ = await fetch(link, {
760
+ method:"GET",
761
+ headers:{
762
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
763
+ "Client-Id":this.clientId,
764
+ },
765
+ });
778
766
 
779
- if (!_.ok) {
780
- return { ok:false, statusText:_.statusText };
781
- }
767
+ if (!_.ok) {
768
+ return { ok:false, statusText:_.statusText };
769
+ }
770
+
771
+ const result = await _.json();
772
+ return { ok:true, result:result.data };
773
+
774
+ }
775
+ catch (error) {
776
+ return { ok:false, error:error.stack };
777
+ }
778
+
779
+ }
780
+ /**
781
+ * 👀 **Renvoi les paramètres de discussion du diffuseur**
782
+ *
783
+ * ---
784
+ * @param {string} username Le nom d'utilisateur du diffuseur dont vous souhaitez obtenir les paramètres de discussion.
785
+ *
786
+ * ---
787
+ * @returns {Promise<{
788
+ * ok:boolean,
789
+ * statusText?:string,
790
+ * error?:string,
791
+ * result?:Array<{
792
+ * broadcaster_id:string,
793
+ * emote_mode:boolean,
794
+ * follower_mode:boolean,
795
+ * follower_mode_duration:number|null,
796
+ * slow_mode:boolean,
797
+ * slow_mode_wait_time:number|null,
798
+ * subscriber_mode:boolean,
799
+ * unique_chat_mode:boolean,
800
+ * }>
801
+ * }>} **Renvoi une promesse d'objet** :
802
+ *
803
+ * • `ok` : État de la requête (true ou false)
804
+ * • `statusText?` : État de la requête (similaire à error)
805
+ * • `error?` : Erreur lors de la récupération des paramètres
806
+ * • `result?` La liste des paramètres de discussion. La liste contient un seul objet avec tous les paramètres.
807
+ * > • `broadcaster_id` L'ID du diffuseur spécifié dans la requête.
808
+ * > • `emote_mode` Une valeur booléenne qui détermine si les messages de discussion doivent contenir uniquement des émoticônes. Est vrai si les messages de discussion ne peuvent contenir que des émoticônes ; sinon, faux.
809
+ * > • `follower_mode` Une valeur booléenne qui détermine si le diffuseur restreint la salle de discussion aux abonnés uniquement. Est vrai si le diffuseur restreint la salle de discussion aux abonnés uniquement ; sinon, faux. Consultez le champ follower_mode_duration pour connaître la durée pendant laquelle les utilisateurs doivent suivre le diffuseur avant de pouvoir participer au salon de discussion.
810
+ * > • `follower_mode_duration` La durée, en minutes, pendant laquelle les utilisateurs doivent suivre le diffuseur avant de pouvoir participer au salon de discussion. Est nul si follower_mode est faux.
811
+ * > • `slow_mode` Une valeur booléenne qui détermine si le diffuseur limite la fréquence à laquelle les utilisateurs de la salle de discussion sont autorisés à envoyer des messages. Est vrai si le diffuseur applique un délai ; sinon, faux. Voir le champ slow_mode_wait_time pour le délai.
812
+ * > • `slow_mode_wait_time` Le temps, en secondes, pendant lequel les utilisateurs doivent attendre entre l'envoi de messages. Est nul si slow_mode est faux.
813
+ * > • `subscriber_mode` Une valeur booléenne qui détermine si seuls les utilisateurs abonnés à la chaîne du diffuseur peuvent parler dans la salle de discussion. Est vrai si le diffuseur restreint le salon de discussion aux abonnés uniquement ; sinon, faux.
814
+ * > • `unique_chat_mode` Une valeur booléenne qui détermine si le diffuseur demande aux utilisateurs de publier uniquement des messages uniques dans la salle de discussion. Est vrai si le diffuseur exige uniquement des messages uniques ; sinon, faux.
815
+ *
816
+ * ---
817
+ * @example
818
+ client.getChatSettings("twitchdev").then(console.log);
819
+ */
820
+ async getChatSettings(username) {
782
821
 
783
- const result = await _.json();
784
- return { ok:true, result:result.data };
822
+ try {
785
823
 
824
+ const user = await this.getUsers([username]);
825
+
826
+ if (!user.ok) {
827
+ return { ok:false, error:user.error ?? user.statusText };
786
828
  }
787
829
 
788
- catch (error) {
789
- return { ok:false, error:error.stack };
830
+ const broadcaster_id = user.result[0]?.id;
831
+
832
+ const link = `https://api.twitch.tv/helix/chat/settings/?broadcaster_id=${broadcaster_id}`;
833
+
834
+ if (this.isExpiredToken()) {
835
+ await this.refreshToken();
790
836
  }
791
837
 
792
- };
793
- /**
794
- * 👀 **Renvoi la couleur utilisée pour le nom de l'utilisateur dans le chat.**
795
- *
796
- * ---
797
- * @param {Array<string>} usernames L'ID de l'utilisateur dont vous souhaitez obtenir la couleur du nom d'utilisateur. L'API ignore les noms en double et les noms introuvables.
798
- *
799
- * ---
800
- * @returns {Promise<{
801
- * ok:boolean,
802
- * statusText?:string,
803
- * error?:string,
804
- * result?:Array<{
805
- * user_id:string,
806
- * user_name:string,
807
- * user_login:string,
808
- * color:string,
809
- * }>
810
- * }>} **Renvoi une promesse d'objet** :
811
- *
812
- * • `ok` : État de la requête (true ou false)
813
- * • `statusText?` : État de la requête (similaire à error)
814
- * • `error?` : Erreur lors de la récupération des couleurs
815
- * • `result?` La liste des utilisateurs et le code couleur qu'ils utilisent pour leur nom.
816
- * > • `user_id` Un identifiant qui identifie de manière unique l'utilisateur.
817
- * > • `user_login` Le nom de connexion de l'utilisateur.
818
- * > • `user_name` Le nom d'affichage de l'utilisateur.
819
- * > • `color` Le code couleur hexadécimal que l'utilisateur utilise dans le chat pour son nom. Si l'utilisateur n'a pas spécifié de couleur dans ses paramètres, la chaîne est vide.
820
- *
821
- * ---
822
- * @example
823
- client.getUsersChatColor(["twitchdev"]).then(console.log);
824
- */
825
- this.getUsersChatColor = async (usernames) => {
826
-
827
- try {
828
-
829
- const users = await this.getUsers(usernames);
830
-
831
- if (!users.ok) {
832
- return { ok:false, error:users.error ?? users.statusText };
833
- }
838
+ const _ = await fetch(link, {
839
+ method:"GET",
840
+ headers:{
841
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
842
+ "Client-Id":this.clientId,
843
+ },
844
+ });
834
845
 
835
- const ids = users.result.map(user => user.id);
846
+ if (!_.ok) {
847
+ return { ok:false, statusText:_.statusText };
848
+ }
836
849
 
837
- const map = ids.join('&user_id=');
838
- const link = `https://api.twitch.tv/helix/chat/color?user_id=${map}`;
850
+ const result = await _.json();
851
+ return { ok:true, result:result.data };
839
852
 
840
- if (this.isExpiredToken()) {
841
- await this.refreshToken();
842
- }
853
+ }
854
+ catch (error) {
855
+ return { ok:false, error:error.stack };
856
+ }
843
857
 
844
- const _ = await fetch(link, {
845
- method:"GET",
846
- headers:{
847
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
848
- "Client-Id":this.clientId,
849
- },
850
- });
858
+ }
859
+ /**
860
+ * 👀 **Renvoi la couleur utilisée pour le nom de l'utilisateur dans le chat.**
861
+ *
862
+ * ---
863
+ * @param {Array<string>} usernames L'ID de l'utilisateur dont vous souhaitez obtenir la couleur du nom d'utilisateur. L'API ignore les noms en double et les noms introuvables.
864
+ *
865
+ * ---
866
+ * @returns {Promise<{
867
+ * ok:boolean,
868
+ * statusText?:string,
869
+ * error?:string,
870
+ * result?:Array<{
871
+ * user_id:string,
872
+ * user_name:string,
873
+ * user_login:string,
874
+ * color:string,
875
+ * }>
876
+ * }>} **Renvoi une promesse d'objet** :
877
+ *
878
+ * • `ok` : État de la requête (true ou false)
879
+ * • `statusText?` : État de la requête (similaire à error)
880
+ * • `error?` : Erreur lors de la récupération des couleurs
881
+ * • `result?` La liste des utilisateurs et le code couleur qu'ils utilisent pour leur nom.
882
+ * > • `user_id` Un identifiant qui identifie de manière unique l'utilisateur.
883
+ * > • `user_login` Le nom de connexion de l'utilisateur.
884
+ * > • `user_name` Le nom d'affichage de l'utilisateur.
885
+ * > • `color` Le code couleur hexadécimal que l'utilisateur utilise dans le chat pour son nom. Si l'utilisateur n'a pas spécifié de couleur dans ses paramètres, la chaîne est vide.
886
+ *
887
+ * ---
888
+ * @example
889
+ client.getUsersChatColor(["twitchdev"]).then(console.log);
890
+ */
891
+ async getUsersChatColor(usernames) {
851
892
 
852
- if (!_.ok) {
853
- return { ok:false, statusText:_.statusText };
854
- }
893
+ try {
855
894
 
856
- const result = await _.json();
857
- return { ok:true, result:result.data };
895
+ const users = await this.getUsers(usernames);
858
896
 
897
+ if (!users.ok) {
898
+ return { ok:false, error:users.error ?? users.statusText };
859
899
  }
860
900
 
861
- catch (error) {
862
- return { ok:false, error:error.stack };
901
+ const ids = users.result.map(user => user.id);
902
+
903
+ const map = ids.join('&user_id=');
904
+ const link = `https://api.twitch.tv/helix/chat/color?user_id=${map}`;
905
+
906
+ if (this.isExpiredToken()) {
907
+ await this.refreshToken();
863
908
  }
864
909
 
865
- };
866
- /**
867
- * 👀 **Obtient un ou plusieurs clips vidéo capturés à partir de flux**
868
- * 💡 **Note** : Pour plus d'informations sur les clips, consultez [Comment utiliser les clips](https://help.twitch.tv/s/article/how-to-use-clips?langage=en_US).
869
- *
870
- * ---
871
- * @param {string} username Un nom d'utilisateur qui identifie le diffuseur dont vous souhaitez obtenir les clips vidéo. Utilisez ce paramètre pour obtenir des clips capturés à partir des flux du diffuseur.
872
- *
873
- * ---
874
- * @param {{
875
- * started_at?:string,
876
- * ended_at?:string,
877
- * first?:number,
878
- * before?:string,
879
- * after?:string
880
- * }} [params] **Paramètres de filtrage** :
881
- *
882
- * • `started_at?` La date de début utilisée pour filtrer les clips. L'API renvoie uniquement les clips situés dans la fenêtre de date de début et de fin. Spécifiez la date et l'heure au format RFC3339.
883
- * • `ended_at?` La date de fin utilisée pour filtrer les clips. Si elle n’est pas spécifiée, la fenêtre horaire correspond à la date de début plus une semaine. Spécifiez la date et l'heure au format RFC3339.
884
- * • `first?` Le nombre maximum de clips à renvoyer par page dans la réponse. La taille de page minimale est de 1 clip par page et la taille maximale est de 100. La valeur par défaut est de 20.
885
- * • `before ?` Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
886
- * • `after` Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
887
- *
888
- * ---
889
- * @returns {Promise<{
890
- * ok:boolean,
891
- * statusText?:string,
892
- * error?:string,
893
- * result?:Array<{
894
- * id:string,
895
- * url:string,
896
- * embed_url:string,
897
- * broadcaster_id:string,
898
- * broadcaster_name:string,
899
- * creator_id:string,
900
- * creator_name:string,
901
- * video_id:string,
902
- * game_id:string,
903
- * language:string,
904
- * title:string,
905
- * view_count:number,
906
- * created_at:string,
907
- * thumbnail_url:string,
908
- * duration:number,
909
- * vod_offset:number|null,
910
- * }>
911
- * }>} **Renvoi une promesse d'objet** :
912
- *
913
- * • `ok` : État de la requête (true ou false)
914
- * • `statusText?` : État de la requête (similaire à error)
915
- * • `error?` : Erreur lors de la récupération des clips
916
- * • `result?` La liste des clips vidéo. Pour les clips renvoyés par game_id ou Broadcaster_id, la liste est classée par ordre décroissant du nombre de vues. Pour les listes renvoyées par id, la liste est dans le même ordre que les ID d'entrée.
917
- * > • `id` Un identifiant qui identifie de manière unique le clip.
918
- * > • `url` Une URL vers le clip.
919
- * > • `embed_url` Une URL que vous pouvez utiliser dans une iframe pour intégrer le clip (voir [Intégration de vidéos et de clips](https://dev.twitch.tv/docs/embed/video-and-clips/)).
920
- * > • `broadcaster_id` Un identifiant qui identifie le diffuseur à partir duquel la vidéo a été extraite.
921
- * > • `broadcaster_name` Le nom d'affichage du diffuseur.
922
- * > • `creator_id` Un identifiant qui identifie l'utilisateur qui a créé le clip.
923
- * > • `creator_name` Le nom d'affichage de l'utilisateur.
924
- * > • `video_id` Un identifiant qui identifie la vidéo d'où provient le clip. Ce champ contient une chaîne vide si la vidéo n'est pas disponible.
925
- * > • `game_id` L'ID du jeu en cours de lecture lors de la création du clip.
926
- * > • `langue` Le code de langue à deux lettres ISO 639-1 dans lequel le diffuseur diffuse. Par exemple, en pour l'anglais. La valeur est différente si le diffuseur utilise une langue que Twitch ne prend pas en charge.
927
- * > • `title` Le titre du clip.
928
- * > • `view_count` Le nombre de fois que le clip a été visionné.
929
- * > • `created_at` La date et l'heure de création du clip. La date et l'heure sont au format RFC3339.
930
- * > • `thumbnail_url` Une URL vers une image miniature du clip.
931
- * > • `duration` La durée du clip, en secondes. La précision est de 0,1.
932
- * > • `vod_offset` Le décalage de base zéro, en secondes, par rapport à l'endroit où le clip commence dans la vidéo (VOD). Est nul si la vidéo n'est pas disponible ou n'a pas encore été créée à partir du flux en direct (voir video_id). Notez qu’il existe un délai entre le moment où un clip est créé lors d’une diffusion et le moment où le décalage est défini. Pendant la période de retard, vod_offset est nul. Le délai est indéterminé mais dure généralement quelques minutes.
933
- *
934
- * ---
935
- * @example
936
- client.getClips("twitchdev").then(console.log);
937
- */
938
- this.getClips = async (username, params) => {
939
-
940
- try {
910
+ const _ = await fetch(link, {
911
+ method:"GET",
912
+ headers:{
913
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
914
+ "Client-Id":this.clientId,
915
+ },
916
+ });
941
917
 
942
- const user = await this.getUsers([username]);
918
+ if (!_.ok) {
919
+ return { ok:false, statusText:_.statusText };
920
+ }
943
921
 
944
- if (!user.ok) {
945
- return { ok:false, error:user.error ?? user.statusText };
946
- }
922
+ const result = await _.json();
923
+ return { ok:true, result:result.data };
947
924
 
948
- const broadcaster_id = user.result[0]?.id;
925
+ }
926
+ catch (error) {
927
+ return { ok:false, error:error.stack };
928
+ }
949
929
 
950
- let link = `https://api.twitch.tv/helix/clips?broadcaster_id=${broadcaster_id}`;
951
- const linkParams = [];
930
+ }
931
+ /**
932
+ * 👀 **Obtient un ou plusieurs clips vidéo capturés à partir de flux**
933
+ * 💡 **Note** : Pour plus d'informations sur les clips, consultez [Comment utiliser les clips](https://help.twitch.tv/s/article/how-to-use-clips?langage=en_US).
934
+ *
935
+ * ---
936
+ * @param {string} username Un nom d'utilisateur qui identifie le diffuseur dont vous souhaitez obtenir les clips vidéo. Utilisez ce paramètre pour obtenir des clips capturés à partir des flux du diffuseur.
937
+ *
938
+ * ---
939
+ * @param {{
940
+ * started_at?:string,
941
+ * ended_at?:string,
942
+ * first?:number,
943
+ * before?:string,
944
+ * after?:string
945
+ * }} [params] **Paramètres de filtrage** :
946
+ *
947
+ * • `started_at?` La date de début utilisée pour filtrer les clips. L'API renvoie uniquement les clips situés dans la fenêtre de date de début et de fin. Spécifiez la date et l'heure au format RFC3339.
948
+ * • `ended_at?` La date de fin utilisée pour filtrer les clips. Si elle n’est pas spécifiée, la fenêtre horaire correspond à la date de début plus une semaine. Spécifiez la date et l'heure au format RFC3339.
949
+ * • `first?` Le nombre maximum de clips à renvoyer par page dans la réponse. La taille de page minimale est de 1 clip par page et la taille maximale est de 100. La valeur par défaut est de 20.
950
+ * • `before ?` Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
951
+ * • `after` Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
952
+ *
953
+ * ---
954
+ * @returns {Promise<{
955
+ * ok:boolean,
956
+ * statusText?:string,
957
+ * error?:string,
958
+ * result?:Array<{
959
+ * id:string,
960
+ * url:string,
961
+ * embed_url:string,
962
+ * broadcaster_id:string,
963
+ * broadcaster_name:string,
964
+ * creator_id:string,
965
+ * creator_name:string,
966
+ * video_id:string,
967
+ * game_id:string,
968
+ * language:string,
969
+ * title:string,
970
+ * view_count:number,
971
+ * created_at:string,
972
+ * thumbnail_url:string,
973
+ * duration:number,
974
+ * vod_offset:number|null,
975
+ * }>
976
+ * }>} **Renvoi une promesse d'objet** :
977
+ *
978
+ * • `ok` : État de la requête (true ou false)
979
+ * • `statusText?` : État de la requête (similaire à error)
980
+ * • `error?` : Erreur lors de la récupération des clips
981
+ * • `result?` La liste des clips vidéo. Pour les clips renvoyés par game_id ou Broadcaster_id, la liste est classée par ordre décroissant du nombre de vues. Pour les listes renvoyées par id, la liste est dans le même ordre que les ID d'entrée.
982
+ * > • `id` Un identifiant qui identifie de manière unique le clip.
983
+ * > • `url` Une URL vers le clip.
984
+ * > • `embed_url` Une URL que vous pouvez utiliser dans une iframe pour intégrer le clip (voir [Intégration de vidéos et de clips](https://dev.twitch.tv/docs/embed/video-and-clips/)).
985
+ * > • `broadcaster_id` Un identifiant qui identifie le diffuseur à partir duquel la vidéo a été extraite.
986
+ * > • `broadcaster_name` Le nom d'affichage du diffuseur.
987
+ * > • `creator_id` Un identifiant qui identifie l'utilisateur qui a créé le clip.
988
+ * > • `creator_name` Le nom d'affichage de l'utilisateur.
989
+ * > • `video_id` Un identifiant qui identifie la vidéo d'où provient le clip. Ce champ contient une chaîne vide si la vidéo n'est pas disponible.
990
+ * > • `game_id` L'ID du jeu en cours de lecture lors de la création du clip.
991
+ * > • `langue` Le code de langue à deux lettres ISO 639-1 dans lequel le diffuseur diffuse. Par exemple, en pour l'anglais. La valeur est différente si le diffuseur utilise une langue que Twitch ne prend pas en charge.
992
+ * > • `title` Le titre du clip.
993
+ * > • `view_count` Le nombre de fois que le clip a été visionné.
994
+ * > • `created_at` La date et l'heure de création du clip. La date et l'heure sont au format RFC3339.
995
+ * > • `thumbnail_url` Une URL vers une image miniature du clip.
996
+ * > • `duration` La durée du clip, en secondes. La précision est de 0,1.
997
+ * > • `vod_offset` Le décalage de base zéro, en secondes, par rapport à l'endroit où le clip commence dans la vidéo (VOD). Est nul si la vidéo n'est pas disponible ou n'a pas encore été créée à partir du flux en direct (voir video_id). Notez qu’il existe un délai entre le moment où un clip est créé lors d’une diffusion et le moment où le décalage est défini. Pendant la période de retard, vod_offset est nul. Le délai est indéterminé mais dure généralement quelques minutes.
998
+ *
999
+ * ---
1000
+ * @example
1001
+ client.getClips("twitchdev").then(console.log);
1002
+ */
1003
+ async getClips(username, params = {}) {
952
1004
 
953
- if (params) {
1005
+ try {
954
1006
 
955
- if (params.started_at) {
956
- linkParams.push(`started_at=${params.started_at}`);
957
- }
958
- if (params.ended_at) {
959
- linkParams.push(`ended_at=${params.ended_at}`);
960
- }
961
- if (params.after) {
962
- linkParams.push(`after=${params.after}`);
963
- }
964
- if (params.before) {
965
- linkParams.push(`before=${params.before}`);
966
- }
967
- if (params.first) {
968
- linkParams.push(`first=${params.first}`);
969
- }
1007
+ const user = await this.getUsers([username]);
970
1008
 
971
- }
1009
+ if (!user.ok) {
1010
+ return { ok:false, error:user.error ?? user.statusText };
1011
+ }
972
1012
 
973
- if (this.isExpiredToken()) {
974
- await this.refreshToken();
975
- }
1013
+ const broadcaster_id = user.result[0]?.id;
976
1014
 
977
- link += "?" + linkParams.join("&");
1015
+ let link = `https://api.twitch.tv/helix/clips?broadcaster_id=${broadcaster_id}`;
1016
+ const linkParams = [];
978
1017
 
979
- const _ = await fetch(link, {
980
- method:"GET",
981
- headers:{
982
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
983
- "Client-Id":this.clientId,
984
- },
985
- });
1018
+ if (params) {
986
1019
 
987
- if (!_.ok) {
988
- return { ok:false, statusText:_.statusText };
1020
+ if (params.started_at) {
1021
+ linkParams.push(`started_at=${params.started_at}`);
1022
+ }
1023
+ if (params.ended_at) {
1024
+ linkParams.push(`ended_at=${params.ended_at}`);
1025
+ }
1026
+ if (params.after) {
1027
+ linkParams.push(`after=${params.after}`);
1028
+ }
1029
+ if (params.before) {
1030
+ linkParams.push(`before=${params.before}`);
1031
+ }
1032
+ if (params.first) {
1033
+ linkParams.push(`first=${params.first}`);
989
1034
  }
990
-
991
- const result = await _.json();
992
- return { ok:true, result:result.data };
993
1035
 
994
1036
  }
995
1037
 
996
- catch (error) {
997
- return { ok:false, error:error.stack };
1038
+ if (this.isExpiredToken()) {
1039
+ await this.refreshToken();
998
1040
  }
999
1041
 
1000
- };
1001
- /**
1002
- * 👀 **Renvoi des informations sur toutes les diffusions sur Twitch**
1003
- *
1004
- * ---
1005
- * @param {{
1006
- * first?:number,
1007
- * after?:string,
1008
- * before?:string,
1009
- * }} [params] **Paramètres de filtrage** :
1010
- *
1011
- * > • `first?` Le nombre maximum d'éléments à renvoyer par page dans la réponse. La taille minimale de la page est de 1 élément par page et la taille maximale est de 100 éléments par page. La valeur par défaut est 20.
1012
- * > • `after?` Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1013
- * > • `before ?` Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1014
- *
1015
- * ---
1016
- * @returns {Promise<{
1017
- * ok:boolean,
1018
- * statusText?:string,
1019
- * error?:string,
1020
- * result?Array<{
1021
- * id:string,
1022
- * name:string,
1023
- * box_art_url:string,
1024
- * igdb_id:string
1025
- * }>
1026
- * }>} **Renvoi une promesse d'objet** :
1027
- *
1028
- * • `ok` : État de la requête (true ou false)
1029
- * • `statusText?` : État de la requête (similaire à error)
1030
- * • `error?` : Erreur lors de la récupération des jeux
1031
- * • `result?` La liste des diffusions. Les émissions sont classées par nombre de téléspectateurs, les plus populaires en premier.
1032
- * > • `id` Un identifiant qui identifie la catégorie ou le jeu.
1033
- * > • `name` Le nom de la catégorie ou du jeu.
1034
- * > • `box_art_url` Une URL vers la pochette de la catégorie ou du jeu. Vous devez remplacer l'espace réservé {width}x{height} par la taille d'image souhaitée.
1035
- * > `igdb_id` L'ID que [IGDB](https://www.igdb.com) utilise pour identifier ce jeu. Si l'ID IGDB n'est pas disponible pour Twitch, ce champ est défini sur une chaîne vide.
1036
- *
1037
- * ---
1038
- * @example
1039
- client.getTopGames().then(console.log);
1040
- */
1041
- this.getTopGames = async (params) => {
1042
-
1043
- try {
1044
-
1045
- let link = `https://api.twitch.tv/helix/games/top`;
1046
- const linkParams = [];
1047
-
1048
- if (params) {
1049
-
1050
- if (params.after) {
1051
- linkParams.push(`after=${params.after}`);
1052
- }
1053
- if (params.before) {
1054
- linkParams.push(`before=${params.before}`);
1055
- }
1056
- if (params.first) {
1057
- linkParams.push(`first=${params.first}`);
1058
- }
1042
+ link += "?" + linkParams.join("&");
1059
1043
 
1060
- }
1044
+ const _ = await fetch(link, {
1045
+ method:"GET",
1046
+ headers:{
1047
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
1048
+ "Client-Id":this.clientId,
1049
+ },
1050
+ });
1061
1051
 
1062
- if (this.isExpiredToken()) {
1063
- await this.refreshToken();
1064
- }
1052
+ if (!_.ok) {
1053
+ return { ok:false, statusText:_.statusText };
1054
+ }
1065
1055
 
1066
- link += "?" + linkParams.join("&");
1056
+ const result = await _.json();
1057
+ return { ok:true, result:result.data };
1067
1058
 
1068
- const _ = await fetch(link, {
1069
- method:"GET",
1070
- headers:{
1071
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
1072
- "Client-Id":this.clientId,
1073
- },
1074
- });
1059
+ }
1060
+ catch (error) {
1061
+ return { ok:false, error:error.stack };
1062
+ }
1075
1063
 
1076
- if (!_.ok) {
1077
- return { ok:false, statusText:_.statusText };
1064
+ }
1065
+ /**
1066
+ * 👀 **Renvoi des informations sur toutes les diffusions sur Twitch**
1067
+ *
1068
+ * ---
1069
+ * @param {{
1070
+ * first?:number,
1071
+ * after?:string,
1072
+ * before?:string,
1073
+ * }} [params] **Paramètres de filtrage** :
1074
+ *
1075
+ * > • `first?` Le nombre maximum d'éléments à renvoyer par page dans la réponse. La taille minimale de la page est de 1 élément par page et la taille maximale est de 100 éléments par page. La valeur par défaut est 20.
1076
+ * > • `after?` Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1077
+ * > • `before ?` Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1078
+ *
1079
+ * ---
1080
+ * @returns {Promise<{
1081
+ * ok:boolean,
1082
+ * statusText?:string,
1083
+ * error?:string,
1084
+ * result?Array<{
1085
+ * id:string,
1086
+ * name:string,
1087
+ * box_art_url:string,
1088
+ * igdb_id:string
1089
+ * }>
1090
+ * }>} **Renvoi une promesse d'objet** :
1091
+ *
1092
+ * • `ok` : État de la requête (true ou false)
1093
+ * • `statusText?` : État de la requête (similaire à error)
1094
+ * • `error?` : Erreur lors de la récupération des jeux
1095
+ * • `result?` La liste des diffusions. Les émissions sont classées par nombre de téléspectateurs, les plus populaires en premier.
1096
+ * > • `id` Un identifiant qui identifie la catégorie ou le jeu.
1097
+ * > • `name` Le nom de la catégorie ou du jeu.
1098
+ * > • `box_art_url` Une URL vers la pochette de la catégorie ou du jeu. Vous devez remplacer l'espace réservé {width}x{height} par la taille d'image souhaitée.
1099
+ * > `igdb_id` L'ID que [IGDB](https://www.igdb.com) utilise pour identifier ce jeu. Si l'ID IGDB n'est pas disponible pour Twitch, ce champ est défini sur une chaîne vide.
1100
+ *
1101
+ * ---
1102
+ * @example
1103
+ client.getTopGames().then(console.log);
1104
+ */
1105
+ async getTopGames(params) {
1106
+
1107
+ try {
1108
+
1109
+ let link = `https://api.twitch.tv/helix/games/top`;
1110
+ const linkParams = [];
1111
+
1112
+ if (params) {
1113
+
1114
+ if (params.after) {
1115
+ linkParams.push(`after=${params.after}`);
1116
+ }
1117
+ if (params.before) {
1118
+ linkParams.push(`before=${params.before}`);
1119
+ }
1120
+ if (params.first) {
1121
+ linkParams.push(`first=${params.first}`);
1078
1122
  }
1079
1123
 
1080
- const result = await _.json();
1081
- return { ok:true, result:result.data };
1124
+ }
1082
1125
 
1126
+ if (this.isExpiredToken()) {
1127
+ await this.refreshToken();
1083
1128
  }
1084
1129
 
1085
- catch (error) {
1086
- return { ok:false, error:error.stack };
1130
+ link += "?" + linkParams.join("&");
1131
+
1132
+ const _ = await fetch(link, {
1133
+ method:"GET",
1134
+ headers:{
1135
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
1136
+ "Client-Id":this.clientId,
1137
+ },
1138
+ });
1139
+
1140
+ if (!_.ok) {
1141
+ return { ok:false, statusText:_.statusText };
1087
1142
  }
1088
1143
 
1089
- };
1090
- /**
1091
- * 👀 **Renvoi des informations sur les catégories ou les jeux spécifiés.**
1092
- * 💡 **Note** : Vous pouvez obtenir jusqu'à 100 catégories ou jeux en spécifiant leur identifiant ou leur nom. Vous pouvez spécifier tous les identifiants, tous les noms ou une combinaison d'identifiants et de noms. Si vous spécifiez une combinaison d'ID et de noms, le nombre total d'ID et de noms ne doit pas dépasser 100.
1093
- *
1094
- * ---
1095
- * @param {Array<string>} gameNames Le nom de la catégorie ou du jeu à obtenir. Le nom doit correspondre exactement au titre de la catégorie ou du jeu. Incluez ce paramètre pour chaque catégorie ou jeu que vous souhaitez obtenir. Vous pouvez spécifier un maximum de 100 noms. Le point de terminaison ignore les noms en double et les noms introuvables.
1096
- *
1097
- * ---
1098
- * @returns {Promise<{
1099
- * ok:boolean,
1100
- * statusText?:string,
1101
- * error?:string,
1102
- * result?:Array<{
1103
- * id:string,
1104
- * name:string,
1105
- * box_art_url:string,
1106
- * igdb_id:string
1107
- * }>
1108
- * }>} **Renvoi une promesse d'objet** :
1109
- *
1110
- * • `ok` : État de la requête (true ou false)
1111
- * • `statusText?` : État de la requête (similaire à error)
1112
- * • `error?` : Erreur lors de la récupération des jeux
1113
- * • `result?` La liste des catégories et des jeux. La liste est vide si les catégories et jeux spécifiés n’ont pas été trouvés.
1114
- * > • `id` Un identifiant qui identifie la catégorie ou le jeu.
1115
- * > • `name` Le nom de la catégorie ou du jeu.
1116
- * > • `box_art_url` Une URL vers la pochette de la catégorie ou du jeu. Vous devez remplacer l'espace réservé {width}x{height} par la taille d'image souhaitée.
1117
- * > • `igdb_id` L'ID que [IGDB](https://www.igdb.com) utilise pour identifier ce jeu. Si l'ID IGDB n'est pas disponible pour Twitch, ce champ est défini sur une chaîne vide.
1118
- *
1119
- * ---
1120
- * @example
1121
- client.getGames(["Fortnite"]).then(console.log);
1122
- */
1123
- this.getGames = async (gameNames) => {
1124
-
1125
- try {
1126
-
1127
- const map = gameNames.join('&name=');
1128
- const link = `https://api.twitch.tv/helix/games?name=${map}`;
1129
-
1130
- if (this.isExpiredToken()) {
1131
- await this.refreshToken();
1132
- }
1144
+ const result = await _.json();
1145
+ return { ok:true, result:result.data };
1133
1146
 
1134
- const _ = await fetch(link, {
1135
- method:"GET",
1136
- headers:{
1137
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
1138
- "Client-Id":this.clientId,
1139
- },
1140
- });
1147
+ }
1148
+ catch (error) {
1149
+ return { ok:false, error:error.stack };
1150
+ }
1141
1151
 
1142
- if (!_.ok) {
1143
- return { ok:false, statusText:_.statusText };
1144
- }
1152
+ }
1153
+ /**
1154
+ * 👀 **Renvoi des informations sur les catégories ou les jeux spécifiés.**
1155
+ * 💡 **Note** : Vous pouvez obtenir jusqu'à 100 catégories ou jeux en spécifiant leur identifiant ou leur nom. Vous pouvez spécifier tous les identifiants, tous les noms ou une combinaison d'identifiants et de noms. Si vous spécifiez une combinaison d'ID et de noms, le nombre total d'ID et de noms ne doit pas dépasser 100.
1156
+ *
1157
+ * ---
1158
+ * @param {Array<string>} gameNames Le nom de la catégorie ou du jeu à obtenir. Le nom doit correspondre exactement au titre de la catégorie ou du jeu. Incluez ce paramètre pour chaque catégorie ou jeu que vous souhaitez obtenir. Vous pouvez spécifier un maximum de 100 noms. Le point de terminaison ignore les noms en double et les noms introuvables.
1159
+ *
1160
+ * ---
1161
+ * @returns {Promise<{
1162
+ * ok:boolean,
1163
+ * statusText?:string,
1164
+ * error?:string,
1165
+ * result?:Array<{
1166
+ * id:string,
1167
+ * name:string,
1168
+ * box_art_url:string,
1169
+ * igdb_id:string
1170
+ * }>
1171
+ * }>} **Renvoi une promesse d'objet** :
1172
+ *
1173
+ * • `ok` : État de la requête (true ou false)
1174
+ * • `statusText?` : État de la requête (similaire à error)
1175
+ * • `error?` : Erreur lors de la récupération des jeux
1176
+ * • `result?` La liste des catégories et des jeux. La liste est vide si les catégories et jeux spécifiés n’ont pas été trouvés.
1177
+ * > • `id` Un identifiant qui identifie la catégorie ou le jeu.
1178
+ * > • `name` Le nom de la catégorie ou du jeu.
1179
+ * > • `box_art_url` Une URL vers la pochette de la catégorie ou du jeu. Vous devez remplacer l'espace réservé {width}x{height} par la taille d'image souhaitée.
1180
+ * > • `igdb_id` L'ID que [IGDB](https://www.igdb.com) utilise pour identifier ce jeu. Si l'ID IGDB n'est pas disponible pour Twitch, ce champ est défini sur une chaîne vide.
1181
+ *
1182
+ * ---
1183
+ * @example
1184
+ client.getGames(["Fortnite"]).then(console.log);
1185
+ */
1186
+ async getGames(gameNames) {
1145
1187
 
1146
- const result = await _.json();
1147
- return { ok:true, result:result.data };
1188
+ try {
1148
1189
 
1149
- }
1190
+ const map = gameNames.join('&name=');
1191
+ const link = `https://api.twitch.tv/helix/games?name=${map}`;
1150
1192
 
1151
- catch (error) {
1152
- return { ok:false, error:error.stack };
1193
+ if (this.isExpiredToken()) {
1194
+ await this.refreshToken();
1153
1195
  }
1154
1196
 
1155
- };
1156
- /**
1157
- * 👀 **Obtient des informations sur une ou plusieurs vidéos publiées. Vous pouvez obtenir des vidéos par identifiant, par utilisateur ou par jeu/catégorie.**
1158
- * 💡 **Note** : Vous pouvez appliquer plusieurs filtres pour obtenir un sous-ensemble de vidéos. Les filtres sont appliqués sous forme d’opération ET à chaque vidéo. Par exemple, si la langue est définie sur « de » et que game_id est défini sur 21779, la réponse inclut uniquement les vidéos montrant des utilisateurs jouant à League of Legends en allemand. Les filtres s'appliquent uniquement si vous obtenez des vidéos par ID utilisateur ou ID de jeu.
1159
- *
1160
- * ---
1161
- * @param {string} username Le nom d'utilisateur de l'utilisateur dont vous souhaitez obtenir la liste des vidéos.
1162
- *
1163
- * ---
1164
- * @param {{
1165
- * game_name?:string,
1166
- * language?:string,
1167
- * period?:"all"|"day"|"month"|"week",
1168
- * sort?:"time"|"trending"|"views",
1169
- * type?:"all"|"archive"|"highlight"|"upload",
1170
- * first?:number,
1171
- * after?:string,
1172
- * before?:string,
1173
- * }} [params] **Paramètres de filtrage** :
1174
- *
1175
- * > • `game_name?` Un nom de catégorie ou de jeu. La réponse contient un maximum de 500 vidéos montrant ce contenu. Pour obtenir les noms de catégories/de jeux, utilisez le point de terminaison Rechercher des catégories.
1176
- * > • `language?` Un filtre utilisé pour filtrer la liste des vidéos en fonction de la langue dans laquelle le propriétaire de la vidéo diffuse. Par exemple, pour obtenir des vidéos diffusées en allemand, définissez ce paramètre sur les deux lettres ISO 639-1. code pour l’allemand (c’est-à-dire DE). Pour obtenir la liste des langues prises en charge, consultez [Langues de flux prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch?lingual=en_US#streamlang). Si la langue n’est pas prise en charge, utilisez « autre ». Spécifiez ce paramètre uniquement si vous spécifiez le paramètre de requête game_name.
1177
- * > • `period?` Un filtre utilisé pour filtrer la liste des vidéos selon leur date de publication. Par exemple, les vidéos publiées la semaine dernière. La valeur par défaut est « tout », qui renvoie les vidéos publiées dans toutes les périodes.
1178
- * > • `sort?` L'ordre dans lequel trier les vidéos renvoyées. La valeur par défaut est « heure ».
1179
- * > • `type?` Un filtre utilisé pour filtrer la liste des vidéos par type de vidéo. La valeur par défaut est « all », qui renvoie tous les types de vidéo.
1180
- * > • `first?` Le nombre maximum d'éléments à renvoyer par page dans la réponse. La taille minimale de la page est de 1 élément par page et la taille maximale est de 100. La valeur par défaut est de 20.
1181
- * > • `after?` Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1182
- * > • `before?` Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1183
- *
1184
- * ---
1185
- * @returns {Promise<{
1186
- * ok:boolean,
1187
- * statusText?:string,
1188
- * error?:string,
1189
- * result?:Array<{
1190
- * id:string,
1191
- * stream_id:string,
1192
- * user_id:string,
1193
- * user_login:string,
1194
- * user_name:string,
1195
- * title:string,
1196
- * description:string,
1197
- * created_at:string,
1198
- * published_at:string,
1199
- * utl:string,
1200
- * thumbnail_url:string,
1201
- * viewable:string,
1202
- * view_count:number,
1203
- * language:string,
1204
- * type:"archive"|"highlight"|"upload",
1205
- * duration:string,
1206
- * muted_segments:Array<{
1207
- * duration:number,
1208
- * offset:number,
1209
- * }>|null,
1210
- * }>
1211
- * }>} **Renvoi une promesse d'objet** :
1212
- *
1213
- * • `ok` : État de la requête (true ou false)
1214
- * • `statusText?` : État de la requête (similaire à error)
1215
- * • `error?` : Erreur lors de la récupération des vidéos
1216
- * • `result?` La liste des vidéos publiées qui correspondent aux critères de filtre.
1217
- * > • `id` Un identifiant qui identifie la vidéo.
1218
- * > • `stream_id` L'ID du flux d'où provient la vidéo si le type de la vidéo est « archive » ; sinon, nul.
1219
- * > • `user_id` L'ID du diffuseur propriétaire de la vidéo.
1220
- * > • `user_login` Le nom de connexion du diffuseur.
1221
- * > • `user_name` Le nom d'affichage du diffuseur.
1222
- * > • `title` Le titre de la vidéo.
1223
- * > • `description` La description de la vidéo.
1224
- * > • `created_at` La date et l'heure, en UTC, de la création de la vidéo. L'horodatage est au format RFC3339.
1225
- * > • `published_at` La date et l'heure, en UTC, de la publication de la vidéo. L'horodatage est au format RFC3339.
1226
- * > • `url` L'URL de la vidéo.
1227
- * > • `thumbnail_url` Une URL vers une image miniature de la vidéo. Avant d'utiliser l'URL, vous devez remplacer les espaces réservés %{width} et %{height} par la largeur et la hauteur de la vignette que vous souhaitez renvoyer. Spécifiez la largeur et la hauteur en pixels. Étant donné que le CDN conserve le rapport de la vignette, celle-ci peut ne pas avoir la taille exacte que vous avez demandée.
1228
- * > • `visible` L'état visible de la vidéo. Toujours défini sur public.
1229
- * > • `view_count` Le nombre de fois que les utilisateurs ont regardé la vidéo.
1230
- * > • `langue` Le code de langue à deux lettres ISO 639-1 dans lequel la vidéo a été diffusée. Par exemple, le code de langue est DE si la vidéo a été diffusée en allemand. Pour obtenir la liste des langues prises en charge, consultez [Langues de flux prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch?lingual=en_US#streamlang). La valeur de langue est « autre » si la vidéo a été diffusée dans une langue ne figurant pas dans la liste des langues prises en charge.
1231
- * > • `type` Le type de la vidéo.
1232
- * > • `durée` La durée de la vidéo au format de durée ISO 8601. Par exemple, 3 min 21 s représente 3 minutes 21 secondes.
1233
- * > • `muted_segments` Les segments que la reconnaissance audio Twitch a désactivés ; sinon, nul.
1234
- * > > • `duration` La durée du segment muet, en secondes.
1235
- * > > • `offset` Le décalage, en secondes, depuis le début de la vidéo jusqu'à l'endroit où commence le segment coupé.
1236
- *
1237
- * ---
1238
- * @example
1239
- client.getVideos("twitchdev").then(console.log);
1240
- */
1241
- this.getVideos = async (username, params) => {
1242
-
1243
- try {
1197
+ const _ = await fetch(link, {
1198
+ method:"GET",
1199
+ headers:{
1200
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
1201
+ "Client-Id":this.clientId,
1202
+ },
1203
+ });
1244
1204
 
1245
- const user = await this.getUsers([username]);
1205
+ if (!_.ok) {
1206
+ return { ok:false, statusText:_.statusText };
1207
+ }
1246
1208
 
1247
- if (!user.ok) {
1248
- return { ok:false, error:user.error ?? user.statusText };
1249
- }
1209
+ const result = await _.json();
1210
+ return { ok:true, result:result.data };
1250
1211
 
1251
- const user_id = user.result[0]?.id;
1212
+ }
1213
+ catch (error) {
1214
+ return { ok:false, error:error.stack };
1215
+ }
1252
1216
 
1253
- let link = `https://api.twitch.tv/helix/videos?user_id=${user_id}`;
1254
- const linkParams = [];
1217
+ }
1218
+ /**
1219
+ * 👀 **Obtient des informations sur une ou plusieurs vidéos publiées. Vous pouvez obtenir des vidéos par identifiant, par utilisateur ou par jeu/catégorie.**
1220
+ * 💡 **Note** : Vous pouvez appliquer plusieurs filtres pour obtenir un sous-ensemble de vidéos. Les filtres sont appliqués sous forme d’opération ET à chaque vidéo. Par exemple, si la langue est définie sur « de » et que game_id est défini sur 21779, la réponse inclut uniquement les vidéos montrant des utilisateurs jouant à League of Legends en allemand. Les filtres s'appliquent uniquement si vous obtenez des vidéos par ID utilisateur ou ID de jeu.
1221
+ *
1222
+ * ---
1223
+ * @param {string} username Le nom d'utilisateur de l'utilisateur dont vous souhaitez obtenir la liste des vidéos.
1224
+ *
1225
+ * ---
1226
+ * @param {{
1227
+ * game_name?:string,
1228
+ * language?:string,
1229
+ * period?:"all"|"day"|"month"|"week",
1230
+ * sort?:"time"|"trending"|"views",
1231
+ * type?:"all"|"archive"|"highlight"|"upload",
1232
+ * first?:number,
1233
+ * after?:string,
1234
+ * before?:string,
1235
+ * }} [params] **Paramètres de filtrage** :
1236
+ *
1237
+ * > • `game_name?` Un nom de catégorie ou de jeu. La réponse contient un maximum de 500 vidéos montrant ce contenu. Pour obtenir les noms de catégories/de jeux, utilisez le point de terminaison Rechercher des catégories.
1238
+ * > • `language?` Un filtre utilisé pour filtrer la liste des vidéos en fonction de la langue dans laquelle le propriétaire de la vidéo diffuse. Par exemple, pour obtenir des vidéos diffusées en allemand, définissez ce paramètre sur les deux lettres ISO 639-1. code pour l’allemand (c’est-à-dire DE). Pour obtenir la liste des langues prises en charge, consultez [Langues de flux prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch?lingual=en_US#streamlang). Si la langue n’est pas prise en charge, utilisez « autre ». Spécifiez ce paramètre uniquement si vous spécifiez le paramètre de requête game_name.
1239
+ * > • `period?` Un filtre utilisé pour filtrer la liste des vidéos selon leur date de publication. Par exemple, les vidéos publiées la semaine dernière. La valeur par défaut est « tout », qui renvoie les vidéos publiées dans toutes les périodes.
1240
+ * > • `sort?` L'ordre dans lequel trier les vidéos renvoyées. La valeur par défaut est « heure ».
1241
+ * > • `type?` Un filtre utilisé pour filtrer la liste des vidéos par type de vidéo. La valeur par défaut est « all », qui renvoie tous les types de vidéo.
1242
+ * > • `first?` Le nombre maximum d'éléments à renvoyer par page dans la réponse. La taille minimale de la page est de 1 élément par page et la taille maximale est de 100. La valeur par défaut est de 20.
1243
+ * > • `after?` Le curseur utilisé pour obtenir la page suivante de résultats. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1244
+ * > • `before?` Le curseur utilisé pour obtenir la page de résultats précédente. L'objet Pagination dans la réponse contient la valeur du curseur. [Lire la suite](https://dev.twitch.tv/docs/api/guide/#pagination)
1245
+ *
1246
+ * ---
1247
+ * @returns {Promise<{
1248
+ * ok:boolean,
1249
+ * statusText?:string,
1250
+ * error?:string,
1251
+ * result?:Array<{
1252
+ * id:string,
1253
+ * stream_id:string,
1254
+ * user_id:string,
1255
+ * user_login:string,
1256
+ * user_name:string,
1257
+ * title:string,
1258
+ * description:string,
1259
+ * created_at:string,
1260
+ * published_at:string,
1261
+ * utl:string,
1262
+ * thumbnail_url:string,
1263
+ * viewable:string,
1264
+ * view_count:number,
1265
+ * language:string,
1266
+ * type:"archive"|"highlight"|"upload",
1267
+ * duration:string,
1268
+ * muted_segments:Array<{
1269
+ * duration:number,
1270
+ * offset:number,
1271
+ * }>|null,
1272
+ * }>
1273
+ * }>} **Renvoi une promesse d'objet** :
1274
+ *
1275
+ * • `ok` : État de la requête (true ou false)
1276
+ * • `statusText?` : État de la requête (similaire à error)
1277
+ * • `error?` : Erreur lors de la récupération des vidéos
1278
+ * • `result?` La liste des vidéos publiées qui correspondent aux critères de filtre.
1279
+ * > • `id` Un identifiant qui identifie la vidéo.
1280
+ * > • `stream_id` L'ID du flux d'où provient la vidéo si le type de la vidéo est « archive » ; sinon, nul.
1281
+ * > • `user_id` L'ID du diffuseur propriétaire de la vidéo.
1282
+ * > • `user_login` Le nom de connexion du diffuseur.
1283
+ * > • `user_name` Le nom d'affichage du diffuseur.
1284
+ * > • `title` Le titre de la vidéo.
1285
+ * > • `description` La description de la vidéo.
1286
+ * > • `created_at` La date et l'heure, en UTC, de la création de la vidéo. L'horodatage est au format RFC3339.
1287
+ * > • `published_at` La date et l'heure, en UTC, de la publication de la vidéo. L'horodatage est au format RFC3339.
1288
+ * > • `url` L'URL de la vidéo.
1289
+ * > • `thumbnail_url` Une URL vers une image miniature de la vidéo. Avant d'utiliser l'URL, vous devez remplacer les espaces réservés %{width} et %{height} par la largeur et la hauteur de la vignette que vous souhaitez renvoyer. Spécifiez la largeur et la hauteur en pixels. Étant donné que le CDN conserve le rapport de la vignette, celle-ci peut ne pas avoir la taille exacte que vous avez demandée.
1290
+ * > • `visible` L'état visible de la vidéo. Toujours défini sur public.
1291
+ * > • `view_count` Le nombre de fois que les utilisateurs ont regardé la vidéo.
1292
+ * > • `langue` Le code de langue à deux lettres ISO 639-1 dans lequel la vidéo a été diffusée. Par exemple, le code de langue est DE si la vidéo a été diffusée en allemand. Pour obtenir la liste des langues prises en charge, consultez [Langues de flux prises en charge](https://help.twitch.tv/s/article/linguals-on-twitch?lingual=en_US#streamlang). La valeur de langue est « autre » si la vidéo a été diffusée dans une langue ne figurant pas dans la liste des langues prises en charge.
1293
+ * > • `type` Le type de la vidéo.
1294
+ * > • `durée` La durée de la vidéo au format de durée ISO 8601. Par exemple, 3 min 21 s représente 3 minutes 21 secondes.
1295
+ * > • `muted_segments` Les segments que la reconnaissance audio Twitch a désactivés ; sinon, nul.
1296
+ * > > • `duration` La durée du segment muet, en secondes.
1297
+ * > > • `offset` Le décalage, en secondes, depuis le début de la vidéo jusqu'à l'endroit où commence le segment coupé.
1298
+ *
1299
+ * ---
1300
+ * @example
1301
+ client.getVideos("twitchdev").then(console.log);
1302
+ */
1303
+ async getVideos(username, params = {}) {
1255
1304
 
1256
- if (params) {
1305
+ try {
1257
1306
 
1258
- if (params.after) {
1259
- linkParams.push(`after=${params.after}`);
1260
- }
1261
- if (params.before) {
1262
- linkParams.push(`before=${params.before}`);
1263
- }
1264
- if (params.first) {
1265
- linkParams.push(`first=${params.first}`);
1266
- }
1267
- if (params.game_name) {
1268
- const game = await this.getGames([params.game_name]);
1269
- if (!game.ok) {
1270
- return { ok:false, error:game.error ?? game.statusText };
1271
- }
1272
- const id = game.result[0].id;
1273
- linkParams.push(`game_id=${id}`);
1274
- }
1275
- if (params.language) {
1276
- linkParams.push(`language=${params.language}`);
1277
- }
1278
- if (params.period) {
1279
- linkParams.push(`period=${params.period}`);
1280
- }
1281
- if (params.sort) {
1282
- linkParams.push(`sort=${params.sort}`);
1283
- }
1284
- if (params.type) {
1285
- linkParams.push(`type=${params.type}`);
1286
- }
1307
+ const user = await this.getUsers([username]);
1287
1308
 
1288
- }
1309
+ if (!user.ok) {
1310
+ return { ok:false, error:user.error ?? user.statusText };
1311
+ }
1289
1312
 
1290
- if (this.isExpiredToken()) {
1291
- await this.refreshToken();
1292
- }
1313
+ const user_id = user.result[0]?.id;
1293
1314
 
1294
- link += "?" + linkParams.join("&");
1315
+ let link = `https://api.twitch.tv/helix/videos?user_id=${user_id}`;
1316
+ const linkParams = [];
1295
1317
 
1296
- const _ = await fetch(link, {
1297
- method:"GET",
1298
- headers:{
1299
- "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
1300
- "Client-Id":this.clientId,
1301
- },
1302
- });
1318
+ if (params) {
1303
1319
 
1304
- if (!_.ok) {
1305
- return { ok:false, statusText:_.statusText };
1320
+ if (params.after) {
1321
+ linkParams.push(`after=${params.after}`);
1322
+ }
1323
+ if (params.before) {
1324
+ linkParams.push(`before=${params.before}`);
1325
+ }
1326
+ if (params.first) {
1327
+ linkParams.push(`first=${params.first}`);
1328
+ }
1329
+ if (params.game_name) {
1330
+ const game = await this.getGames([params.game_name]);
1331
+ if (!game.ok) {
1332
+ return { ok:false, error:game.error ?? game.statusText };
1333
+ }
1334
+ const id = game.result[0].id;
1335
+ linkParams.push(`game_id=${id}`);
1336
+ }
1337
+ if (params.language) {
1338
+ linkParams.push(`language=${params.language}`);
1339
+ }
1340
+ if (params.period) {
1341
+ linkParams.push(`period=${params.period}`);
1342
+ }
1343
+ if (params.sort) {
1344
+ linkParams.push(`sort=${params.sort}`);
1345
+ }
1346
+ if (params.type) {
1347
+ linkParams.push(`type=${params.type}`);
1306
1348
  }
1307
1349
 
1308
- const result = await _.json();
1309
- return { ok:true, result:result.data };
1350
+ }
1310
1351
 
1352
+ if (this.isExpiredToken()) {
1353
+ await this.refreshToken();
1311
1354
  }
1312
1355
 
1313
- catch (error) {
1314
- return { ok:false, error:error.stack };
1356
+ link += "?" + linkParams.join("&");
1357
+
1358
+ const _ = await fetch(link, {
1359
+ method:"GET",
1360
+ headers:{
1361
+ "Authorization":`${TwitchToken.token_type} ${TwitchToken.access_token}`,
1362
+ "Client-Id":this.clientId,
1363
+ },
1364
+ });
1365
+
1366
+ if (!_.ok) {
1367
+ return { ok:false, statusText:_.statusText };
1315
1368
  }
1316
1369
 
1317
- };
1370
+ const result = await _.json();
1371
+ return { ok:true, result:result.data };
1372
+
1373
+ }
1374
+
1375
+ catch (error) {
1376
+ return { ok:false, error:error.stack };
1377
+ }
1318
1378
 
1319
1379
  }
1320
1380