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