{"_id":"@beret.27/discord-app-emojis","_rev":"6-66afd67d929808c439532f1be30fe9ec","name":"@beret.27/discord-app-emojis","dist-tags":{"latest":"1.4.0"},"versions":{"1.3.1":{"name":"@beret.27/discord-app-emojis","version":"1.3.1","keywords":["discord","emoji","discord.js","application-emojis","discord-emojis","discord-bot","node","automation","sync"],"author":{"name":"beret.27"},"license":"MIT","_id":"@beret.27/discord-app-emojis@1.3.1","maintainers":[{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"}],"dist":{"shasum":"1421a0265d5731289b1f884b072be374eef27f35","tarball":"https://registry.npmjs.org/@beret.27/discord-app-emojis/-/discord-app-emojis-1.3.1.tgz","fileCount":15,"integrity":"sha512-4hq4BPI0c2Nlhcpt4jXa27FonqK8jNsUdXV3WUHXzmSpcgBKlw8GKcyKEgUen8ORhqsAY+bHCvr8hyoOwlD7jA==","signatures":[{"sig":"MEUCIQC4GQHhdhOufUf7nkU1TLyxmjWllRXUrCoJRbI/VCefrAIgfv0ziC1vBwfNe/src7H014EA6LwHQE+s+Gl9BKJKd00=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28460},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"exports":{".":"./src/index.js"},"private":false,"scripts":{"check":"node --check src/index.js","publish:ci":"npm publish --access public --provenance","publish:local":"npm publish --access public","prepublishOnly":"npm run check"},"_npmUser":{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"},"_npmVersion":"11.1.0","description":"Professional Discord application emoji manager for Node.js and discord.js","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.13.2","sharp":"^0.33.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/discord-app-emojis_1.3.1_1773490923870_0.16467500378569122","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@beret.27/discord-app-emojis","version":"1.3.2","keywords":["discord","emoji","discord.js","application-emojis","discord-emojis","discord-bot","node","automation","sync"],"author":{"name":"beret.27"},"license":"MIT","_id":"@beret.27/discord-app-emojis@1.3.2","maintainers":[{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"}],"dist":{"shasum":"b920743fc202b02907af1aedf75374ba8ca55a0c","tarball":"https://registry.npmjs.org/@beret.27/discord-app-emojis/-/discord-app-emojis-1.3.2.tgz","fileCount":15,"integrity":"sha512-l/KhZAd2cVJrqODjUL1xkKeJ/ayI75kvpJ/F6BeHyriqAURV85OAdnEaOmcbMCxR8QhwMRJyiWJmBCNPq1lFUw==","signatures":[{"sig":"MEYCIQDbxXb9L2H1PakL6u6aDYeIoLEhYZmk6dGFuFFaZ0PTgAIhAMYqCC8sXF5/SIOR9kcYBKl9Cz5BJ4pYx7j2HjQ9Uo3z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27221},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"exports":{".":"./src/index.js"},"private":false,"scripts":{"check":"node --check src/index.js","publish:ci":"npm publish --access public --provenance","publish:local":"npm publish --access public","prepublishOnly":"npm run check"},"_npmUser":{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"},"_npmVersion":"11.1.0","description":"Discord application emoji manager pour Node.js and discord.js","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.13.2","sharp":"^0.33.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/discord-app-emojis_1.3.2_1773491057524_0.6489456598260661","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@beret.27/discord-app-emojis","version":"1.3.3","keywords":["discord","emoji","discord.js","application-emojis","discord-emojis","discord-bot","node","automation","sync"],"author":{"name":"beret.27"},"license":"MIT","_id":"@beret.27/discord-app-emojis@1.3.3","maintainers":[{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"}],"dist":{"shasum":"0b8676db4671c2fc13b2bf8ffa87cabadf403052","tarball":"https://registry.npmjs.org/@beret.27/discord-app-emojis/-/discord-app-emojis-1.3.3.tgz","fileCount":15,"integrity":"sha512-PniOLqbT7BW2irtgJn+0YjA9de4yPgriOF7/r3yNomt4YJxlK0bhahS7OlTSlo1v79uH3PqShYnhu2O5ffzT+A==","signatures":[{"sig":"MEQCICx+ueVOQYJTdA69FTlCPSHhNZa1GlsstF/7GyOeqHiaAiBngNrx2xDVVz68vWeZAyTJ7xouCqGPOyVIp8nWM3kAlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29229},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"exports":{".":"./src/index.js"},"private":false,"scripts":{"check":"node --check src/index.js","publish:ci":"npm publish --access public --provenance","publish:local":"npm publish --access public","prepublishOnly":"npm run check"},"_npmUser":{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"},"_npmVersion":"11.1.0","description":"Discord application emoji manager pour Node.js and discord.js","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.13.2","sharp":"^0.33.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/discord-app-emojis_1.3.3_1773492945088_0.989050230918294","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@beret.27/discord-app-emojis","version":"1.3.4","keywords":["discord","emoji","discord.js","application-emojis","discord-emojis","discord-bot","node","automation","sync"],"author":{"name":"beret.27"},"license":"MIT","_id":"@beret.27/discord-app-emojis@1.3.4","maintainers":[{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"}],"dist":{"shasum":"cd057aed3464111ce7d646d66a6c923309a0ebb6","tarball":"https://registry.npmjs.org/@beret.27/discord-app-emojis/-/discord-app-emojis-1.3.4.tgz","fileCount":15,"integrity":"sha512-Num3SZ5x+TgN69bZX64M7CCHnhpGw7TKOgylghBcFJMYuMcbT4bIE/GlYYI6ZIPGrwC2YXHLAK+bH5mex7quCg==","signatures":[{"sig":"MEUCIF2FpnRAihZRaneMlbp0QMnM3XRC4gObPUCc2SmfPxluAiEAuSyvCKsI0zzqivJtI9ZS+zXRpCE0dWhlaf0I26ZHC/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31529},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"exports":{".":"./src/index.js"},"private":false,"scripts":{"check":"node --check src/index.js","publish:ci":"npm publish --access public --provenance","publish:local":"npm publish --access public","prepublishOnly":"npm run check"},"_npmUser":{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"},"_npmVersion":"11.1.0","description":"Discord application emoji manager pour Node.js and discord.js","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.13.2","sharp":"^0.33.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/discord-app-emojis_1.3.4_1773493433441_0.21465378633649013","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@beret.27/discord-app-emojis","version":"1.3.5","keywords":["discord","emoji","discord.js","application-emojis","discord-emojis","discord-bot","node","automation","sync"],"author":{"name":"beret.27"},"license":"MIT","_id":"@beret.27/discord-app-emojis@1.3.5","maintainers":[{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"}],"dist":{"shasum":"d2573a312be73d193009e524caf526248dbd5072","tarball":"https://registry.npmjs.org/@beret.27/discord-app-emojis/-/discord-app-emojis-1.3.5.tgz","fileCount":15,"integrity":"sha512-HDY2a8CoFXVAnpzGkar9/5wsQkz0I1jgldwGM5fFS2urkunwkfzubdDOlgdEF6jWCECodKHrqZdUzWSxoKI+XQ==","signatures":[{"sig":"MEUCIGw8mj073qvKfRHfZLncb78UaSr5fyPziEAvDs5v2n+XAiEA/cLc0UlLEfy8ik1XNxOwAcl0G/pVVMBakhd35lfChrY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31855},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"exports":{".":"./src/index.js"},"private":false,"scripts":{"check":"node --check src/index.js","publish:ci":"npm publish --access public --provenance","publish:local":"npm publish --access public","prepublishOnly":"npm run check"},"_npmUser":{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"},"_npmVersion":"11.1.0","description":"Discord application emoji manager pour Node.js and discord.js","directories":{},"_nodeVersion":"22.14.0","dependencies":{"axios":"^1.13.2","sharp":"^0.33.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/discord-app-emojis_1.3.5_1773493647751_0.8062487604180519","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@beret.27/discord-app-emojis","version":"1.4.0","private":false,"description":"Discord application emoji manager pour Node.js and discord.js","author":{"name":"beret.27"},"keywords":["discord","emoji","discord.js","application-emojis","discord-emojis","discord-bot","node","automation","sync"],"license":"MIT","type":"commonjs","main":"src/index.js","exports":{".":"./src/index.js"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"scripts":{"check":"node --check src/index.js","prepublishOnly":"npm run check","publish:local":"npm publish --access public","publish:ci":"npm publish --access public --provenance"},"dependencies":{"axios":"^1.13.2","sharp":"^0.33.5"},"_id":"@beret.27/discord-app-emojis@1.4.0","_nodeVersion":"22.14.0","_npmVersion":"11.1.0","dist":{"integrity":"sha512-2QxDOQlxueTmEiKRWwddI3cHluF9IL++u3prsoclwuFwAU+cCMkEj2pJJ6GX26MrD4t9K0rCOd2NiYwmpsrctQ==","shasum":"a2fcd9ff54282190511aa86e0873a0aae65b8f85","tarball":"https://registry.npmjs.org/@beret.27/discord-app-emojis/-/discord-app-emojis-1.4.0.tgz","fileCount":16,"unpackedSize":42729,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDpG2aUP6ZaID5om/2SgYyJN84nYjpGX7NkxzAfNUj/vAIhAJgqrkNU7am5nINuPM8Ar/uqXGeh2OrS70SXleIJlexE"}]},"_npmUser":{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"},"directories":{},"maintainers":[{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/discord-app-emojis_1.4.0_1784221612734_0.58693537176066"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-14T12:22:03.722Z","modified":"2026-07-16T17:06:53.037Z","1.3.1":"2026-03-14T12:22:04.029Z","1.3.2":"2026-03-14T12:24:17.689Z","1.3.3":"2026-03-14T12:55:45.241Z","1.3.4":"2026-03-14T13:03:53.632Z","1.3.5":"2026-03-14T13:07:27.895Z","1.4.0":"2026-07-16T17:06:52.879Z"},"author":{"name":"beret.27"},"license":"MIT","keywords":["discord","emoji","discord.js","application-emojis","discord-emojis","discord-bot","node","automation","sync"],"description":"Discord application emoji manager pour Node.js and discord.js","maintainers":[{"name":"beret.27","email":"jeuxvideocompte2@gmail.com"}],"readme":"# @beret.27/discord-app-emojis\n\n> Gérer, synchroniser, réparer **et télécharger** les emojis d'application Discord depuis Node.js et discord.js.\n\n<sub>ReadMe rédigé avec l'aide d'une IA — des erreurs sont possibles. En cas de souci : Discord `levraiberet`.</sub>\n\n---\n\n## Sommaire\n\n- [Installation](#installation)\n- [Démarrage rapide](#démarrage-rapide)\n- [Création du module](#création-du-module)\n- [API](#api)\n  - [`getemoji(name, options)`](#getemojiname-options)\n  - [`getallemoji({ name })`](#getallemoji-name-)\n  - [`getemojinumber()`](#getemojinumber)\n  - [`downloadEmojis(options)`](#downloademojisoptions)\n  - [`downloadEmoji(name, options)`](#downloademojiname-options)\n- [Options de configuration](#options-de-configuration)\n- [Cas d'usage](#cas-dusage)\n- [Structure du projet](#structure-du-projet)\n\n---\n\n## Installation\n\n```bash\nnpm install @beret.27/discord-app-emojis\n```\n\n**Prérequis :** Node.js `>= 18`. Les dépendances `axios` et `sharp` sont installées automatiquement.\n\n---\n\n## Démarrage rapide\n\n```js\nconst { createEmojiModule } = require('@beret.27/discord-app-emojis');\n\nconst emoji = await createEmojiModule({\n  token: process.env.DISCORD_BOT_TOKEN,\n  emojiDir: './emojis',\n}).init();\n\n// Récupérer la mention d'un emoji (le crée si le fichier local existe)\nconst yes = await emoji.getemoji('yes', { update: true });\n\n// Télécharger tous les emojis du bot dans un dossier\nawait emoji.downloadEmojis({ dir: './backup' });\n```\n\n---\n\n## Création du module\n\nDeux façons d'initialiser le module.\n\n### 1) Avec un client discord.js *(recommandé)*\n\n```js\nconst emoji = await createEmojiModule({\n  client, // client discord.js déjà connecté (login effectué)\n  emojiDir: './emojis',\n}).init();\n```\n\n### 2) Avec un token *(sans discord.js)*\n\n```js\nconst emoji = await createEmojiModule({\n  token: process.env.DISCORD_BOT_TOKEN,\n  appId: process.env.DISCORD_APP_ID, // optionnel : déduit du token si absent\n  emojiDir: './emojis',\n}).init();\n```\n\n> `init()` charge le cache des emojis distants et, si `syncOnInit` est actif, reconstruit les emojis manquants à partir du dossier local.\n\n---\n\n## API\n\n### `getemoji(name, options)`\n\nRetourne la mention `<:name:id>` (ou `<a:name:id>` si animé), prête à être envoyée dans un message.\n\n| Option | Type | Description |\n|---|---|---|\n| `update` | `boolean` | Crée l'emoji s'il est absent (fichier local requis) et le met à jour si le visuel local diffère du distant. |\n| `delete` | `boolean` | Supprime l'emoji distant portant ce nom. |\n| `default` | `string` | Valeur de repli renvoyée en cas d'erreur ou d'emoji introuvable (défaut `❓`). |\n\n> `upload` est accepté comme alias de `update`.\n\n```js\nconst v = await emoji.getemoji('yes', {\n  update: true,\n  default: '❓',\n});\n```\n\n---\n\n### `getallemoji({ name })`\n\nRetourne la liste de tous les emojis, ou seulement ceux dont le nom **contient** `name`.\n\n```js\nconst all = await emoji.getallemoji();          // tout\nconst para = await emoji.getallemoji({ name: 'para' }); // filtré\n```\n\nChaque emoji renvoyé a la forme :\n\n```js\n{ id, name, animated, mention, url }\n```\n\n---\n\n### `getemojinumber()`\n\nRetourne le nombre total d'emojis d'application du bot.\n\n```js\nconst count = await emoji.getemojinumber();\n```\n\n---\n\n### `downloadEmojis(options)`\n\nTélécharge les emojis **au format Discord** (`.webp` pour les statiques, `.gif` pour les animés) dans un dossier. Chaque fichier prend le **nom de l'emoji** + l'extension correspondante.\n\n| Option | Type | Défaut | Description |\n|---|---|---|---|\n| `dir` | `string` | `downloadDir` | Dossier cible (créé s'il n'existe pas). |\n| `names` | `string[]` | *(tous)* | Sous-ensemble de noms à télécharger. Si absent, télécharge **tout**. |\n| `overwrite` | `boolean` | `true` | `false` pour ignorer les fichiers déjà présents. |\n| `concurrency` | `number` | `syncConcurrency` | Nombre de téléchargements en parallèle. |\n\n```js\n// Tout télécharger\nawait emoji.downloadEmojis({ dir: './backup' });\n\n// Télécharger seulement certains emojis par leur nom\nawait emoji.downloadEmojis({\n  dir: './pack',\n  names: ['yes', 'no', 'para_swag'],\n});\n\n// Sauvegarde incrémentale (ne re-télécharge pas l'existant)\nawait emoji.downloadEmojis({ dir: './backup', overwrite: false });\n```\n\nValeur de retour : un tableau de résultats, un par emoji.\n\n```js\n[\n  { name: 'yes', path: '.../backup/yes.webp', skipped: false, bytes: 4821 },\n  { name: 'wave', path: '.../backup/wave.gif', skipped: false, bytes: 19233 },\n  { name: 'broken', error: 'CDN 404 pour broken' },\n]\n```\n\n---\n\n### `downloadEmoji(name, options)`\n\nTélécharge **un seul** emoji par son nom. Mêmes options que `downloadEmojis` (hors `names`). Retourne le résultat unique (ou `null` si le nom n'existe pas).\n\n```js\nconst res = await emoji.downloadEmoji('yes', { dir: './pack' });\n// { name: 'yes', path: '.../pack/yes.webp', skipped: false, bytes: 4821 }\n```\n\n---\n\n## Options de configuration\n\nPassées à `createEmojiModule(options)`.\n\n### Connexion\n\n| Option | Type | Défaut | Description |\n|---|---|---|---|\n| `client` | `Discord.Client` | — | Client discord.js connecté (sinon `token`). |\n| `token` | `string` | `env.DISCORD_BOT_TOKEN` | Token du bot (requis si pas de `client`). |\n| `appId` | `string` | *(déduit)* | ID d'application ; déduit du `client` ou du `token`. |\n| `timeoutMs` | `number` | `20000` | Timeout des requêtes API / CDN. |\n\n### Dossiers\n\n| Option | Type | Défaut | Description |\n|---|---|---|---|\n| `emojiDir` | `string` | `./emojis` | Dossier des images sources locales. |\n| `downloadDir` | `string` | `./emojis/downloads` | Dossier par défaut de `downloadEmojis`. |\n| `createDirIfMissing` | `boolean` | `true` | Crée les dossiers manquants. |\n\n### Cache\n\n| Option | Type | Défaut | Description |\n|---|---|---|---|\n| `cacheTtlMs` | `number` | `30000` | Durée de validité du cache des emojis distants (ms). |\n| `refreshOnMiss` | `boolean` | `true` | Rafraîchit le cache si un nom demandé est absent. |\n\n### Synchronisation au démarrage\n\n| Option | Type | Défaut | Description |\n|---|---|---|---|\n| `syncOnInit` | `boolean` | `false` | Resynchronise les emojis locaux à l'`init()`. |\n| `syncOnInitMode` | `string` | `missing-only` | `missing-only` ou `update-all`. |\n| `syncConcurrency` | `number` | `8` | Traitements en parallèle. |\n| `updateStrategy` | `string` | `missing-only` | `missing-only` ou `strict-remote-hash`. |\n| `syncDefault` | `string` | — | Valeur de repli pendant le sync. |\n\n### Normalisation des images (avant upload)\n\n| Option | Type | Défaut | Description |\n|---|---|---|---|\n| `normalizeUploads` | `boolean` | `false` | Normalise les images avant l'envoi à Discord. |\n| `normalizeSize` | `number` | `128` | Taille cible (px). |\n| `normalizeFormat` | `string` | `png` | `png`, `webp` ou `jpeg`. |\n| `normalizeCacheDir` | `string` | `./emojis/.discord-cache` | Cache disque des images converties. |\n\n### Logs\n\n| Option | Type | Défaut | Description |\n|---|---|---|---|\n| `log` | `boolean` | `false` | Active les logs du module. |\n| `logLevels` | `string[]` | tous | Filtre par niveau : `debug`, `info`, `warn`, `error`. |\n| `logEvents` | `string[]` | tous | Filtre par event : `create`, `update`, `delete`, `download`, … |\n| `logger` | `object` | `console` | Logger personnalisé (compatible `console`). |\n\n---\n\n## Cas d'usage\n\n### Sauvegarder tous les emojis du bot\n\n```js\nconst emoji = await createEmojiModule({ client }).init();\nawait emoji.downloadEmojis({ dir: './backup', overwrite: false });\n```\n\n### Réparer des emojis renommés / inversés\n\nSi les noms existent encore sur le bot mais pointent vers le mauvais visuel :\n\n```js\nconst emoji = await createEmojiModule({\n  client,\n  emojiDir: './emojis',\n  syncOnInit: true,\n  syncOnInitMode: 'update-all',\n  updateStrategy: 'strict-remote-hash',\n  syncConcurrency: 8,\n}).init();\n```\n\nCe mode compare visuellement le local et le distant, puis recrée l'emoji si le contenu ne correspond pas.\n\nQuand `normalizeUploads` est activé, un cache disque des images converties est créé dans `.discord-cache` pour éviter les reconversions et réduire la latence.\n\n---\n\n## Structure du projet\n\nLe code est découpé dans `src/fonction/`, une responsabilité par fichier :\n\n| Fichier | Rôle |\n|---|---|\n| `resolveContext.js` | Construit le contexte (token, appId, dossiers, options). |\n| `moduleState.js` | Cache, comparaison visuelle, préparation des images. |\n| `remoteApi.js` | Appels API Discord (liste / création / suppression). |\n| `getemoji.js` | Récupération / création / mise à jour / suppression d'un emoji. |\n| `getallemoji.js` | Liste filtrable des emojis. |\n| `getemojinumber.js` | Nombre total d'emojis. |\n| `downloadEmoji.js` | Téléchargement des emojis au format Discord. |\n| `emojiDir.js` | Résolution des dossiers et fichiers locaux. |\n| `logger.js` | Logs colorés et empilables. |\n| `sanitizeName.js` | Nettoyage des noms d'emoji. |\n\n---\n\n## Script tout-en-un : télécharger tous les emojis d'un bot\n\nCopier-coller, renseigner le **token** et le **dossier**, lancer avec `node backup.js`. Télécharge **tous** les emojis du bot dans le dossier indiqué, au format Discord (`.webp` / `.gif`), en parallèle.\n\n```js\n// backup.js\nconst { createEmojiModule } = require('@beret.27/discord-app-emojis');\n\n// ⬇️ À MODIFIER\nconst TOKEN = 'TON_TOKEN_BOT_ICI';\nconst DOSSIER = './backup-emojis'; // dossier de destination (créé si absent)\n\n(async () => {\n  const emoji = await createEmojiModule({\n    token: TOKEN,\n    log: true, // affiche la progression\n  }).init();\n\n  const results = await emoji.downloadEmojis({\n    dir: DOSSIER,\n    concurrency: 16, // téléchargements en parallèle = rapide\n  });\n\n  const ok = results.filter((r) => !r.error).length;\n  const ko = results.length - ok;\n  console.log(`\\n✅ ${ok} emoji(s) téléchargé(s) dans ${DOSSIER}` + (ko ? ` — ❌ ${ko} échec(s)` : ''));\n})();\n```\n\n> Astuce : pour ne récupérer que certains emojis, ajoute `names: ['yes', 'no', 'wave']` dans `downloadEmojis({ ... })`.\n\n---\n\n## Licence\n\nMIT © beret.27\n","readmeFilename":"README.md"}