Packages Utiles
Certains des exemples de cette section sont loin d'être complets. Nous vous encourageons à consulter la documentation officielle pour tous les packages que vous envisagez d'utiliser dans votre code. Nous voulons simplement pointer certains que nous avons trouvés utiles lors de nos efforts de développement d'applications Discord pendant des années et vous donner envie d'essayer et de tester certains d'entre eux dans votre base de code !
Day.js
Day.js est un package puissant qui analyse, valide, manipule et affiche les dates et les heures en JavaScript. Il vous permet de formater rapidement et facilement les dates de n'importe quelle façon que vous souhaitez ou d'analyser des chaînes pour les convertir en objets JavaScript Date. Il existe de nombreux plugins pour cela qui vous permettent de travailler avec des durées et plus.
Par exemple, si vous vouliez demander à vos utilisateurs de vous donner une date, vous pouvez utiliser Day.js pour la convertir en objet Date que vous pouvez utiliser dans votre code :
const input = await interaction.channel.awaitMessages({
filter: (m) => m.author.id === interaction.user.id,
max: 1,
time: 10e3,
errors: ['time'],
});
const date = dayjs(input.first().content).toDate();En utilisant le plugin de durée, vous pouvez dire à l'utilisateur si la date est dans le futur ou le passé :
if (date.isValid()) {
const now = dayjs();
const duration = date - now;
const formatted = dayjs.duration(duration, 'ms').format();
if (duration > 0) {
interaction.reply(`La date que vous m'avez donnée est ${formatted} dans le futur.`);
} else {
interaction.reply(`La date que vous m'avez donnée est ${formatted} dans le passé.`);
}
} else {
interaction.reply("Vous ne m'avez pas donné une date valide.");
}ms
Ms est un autre outil pour travailler avec les temps en JavaScript. Cependant, ms se spécialise dans les durées. Il vous permet de convertir les temps en millisecondes en formats lisibles par l'homme et vice-versa.
Exemple :
await interaction.reply("Envoyez deux messages et je vous dirai à quel point ils sont éloignés.");
const messages = await interaction.channel.awaitMessages({
filter: (m) => m.author.id === interaction.user.id,
max: 2,
time: 30e3,
errors: ['time'],
});
const difference = messages.last().createdTimestamp - messages.first().createdTimestamp;
const formatted = ms(difference);
await interaction.followUp(`Vous avez envoyé les deux messages ${formatted} d'intervalle.`);common-tags
Documentation officielle : https://github.com/zspecza/common-tags
Common-tags est une bibliothèque entièrement consacrée au travail avec des littéraux de modèle. Jusqu'à présent, vous avez probablement uniquement utilisé des littéraux de modèle pour interpoler des variables dans vos chaînes, mais ils peuvent faire beaucoup plus. Si vous avez du temps, vous devriez consulter la documentation de MDN sur les littéraux balancés..
Vous avez été ennuyé par le fait que vos chaînes multi-lignes avaient des morceaux désagréables d'indentation, mais vous ne vouliez pas supprimer l'indentation dans votre code source ? common-tags est là pour vous :
const packageName = 'common-tags';
if (someCondition) {
const poem = stripIndents`
J'aime ${packageName}.
Cela rend mes chaînes si belles,
vous devriez aussi l'utiliser.
`;
console.log(poem);
}Cela affichera votre petit poème comme prévu, mais il n'aura pas de tabulations ni d'autres espaces blancs à gauche.
Mais ce n'est que le début ! Un autre ensemble de fonctions utiles sont les fonctions liées aux listes :
inlineLists, commaLists, etc.
Avec celles-ci, vous pouvez facilement interpoler des tableaux dans vos chaînes sans qu'elles n'aient l'air laid :
const options = ['ajouter', 'supprimer', 'éditer'];
// -> Voulez-vous que j'ajoute, supprime ou édite le canal ?
interaction.reply(oneLineCommaListsOr`
Voulez-vous que j'${options} le canal ?
`);Vérifiez la documentation pour trouver plus de fonctions utiles.
chalk
Chalk n'est pas exactement utile pour les bots Discord eux-mêmes, mais cela rendra votre sortie de terminal beaucoup plus jolie et organisée.
Ce package vous permet de colorer et de styliser vos console.log de plusieurs façons différentes ; Plus de simples blanc sur noir.
Supposons que vous vouliez que vos messages d'erreur soient facilement visibles ; Donnons-leur une belle couleur rouge :
console.error(chalk.redBright('ERREUR FATALE'), 'Quelque chose de vraiment grave s'est produit!');Vous pouvez également enchainer plusieurs multiplicateurs différents. Si vous vouliez avoir du texte vert, un arrière-plan gris, et que tout soit souligné, c'est possible :
console.log(chalk.green.bgBrightBlack.underline('C'est tellement joli.'));pino
Pino est un logger Node.js avec une très faible surcharge. Mais pourquoi est-ce que cela importe même, si console.log() existe ? Eh bien, console.log() est assez lent et pas très polyvalent. Chaque fois que vous effectuez un appel à console.log(), votre programme s'arrête et ne peut rien faire jusqu'à ce que l'enregistrement soit terminé.
Pour commencer, installez le package :
npm install pino
npm install -g pino-prettyPino est hautement configurable, nous vous recommandons donc vivement de consulter leur documentation vous-même.
Pour utiliser le même logger dans tout le projet, vous pouvez mettre le code suivant dans son propre fichier, par exemple logger.js et l'importer si nécessaire :
const pino = require('pino');
const logger = pino();
module.exports = logger;const { Client, Events, GatewayIntentBits } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
const logger = require('./logger');
client.once(Events.ClientReady, () => logger.info('Le bot est en ligne'));
client.on(Events.Debug, (info) => logger.debug(info));
client.on(Events.Warn, (info) => logger.warn(info));
client.on(Events.Error, (error) => logger.error(error));
client.login('votre-token-va-ici');Pino enregistre dans un format json, de sorte que d'autres programmes et services comme les agrégateurs de journaux peuvent facilement analyser et travailler avec la sortie. Ceci est très utile pour les systèmes de production, mais assez fastidieux à lire pendant le développement. C'est pourquoi vous avez installé pino-pretty plus tôt. Au lieu de formater la sortie du journal lui-même, les développeurs ont recommandé que vous tuyautez la sortie du journal vers d'autres services à la place. pino-pretty est un formateur que vous pouvez utiliser pour des journaux faciles à lire pendant le développement.
Nous vous recommandons de configurer pino-pretty dans un script de package dans votre fichier package.json, plutôt que de taper le tuyau à chaque fois. Veuillez lire notre section du guide sur les scripts de package, si vous ne savez pas de quoi nous parlons.
{
"name": "my-bot",
"version": "1.0.0",
"description": "Un bot Discord !",
"main": "index.js",
"scripts": {
"test": "echo \"Erreur : aucun test spécifié\" && exit 1",
"start": "node .",
"lint": "eslint .",
"dev": "node . | pino-pretty -i pid,hostname -t 'yyyy-mm-dd HH:MM:ss'"
},
"keywords": [],
"author": "",
"license": "ISC"
}Si vous utilisez PowerShell, vous devez utiliser un script de package pour pino-pretty. PowerShell gère les tuyaux d'une façon
qui empêche l'enregistrement. L'interface de ligne de commande n'est pas affectée.
Dans l'exemple ci-dessus, d'autres arguments sont passés à pino-pretty pour modifier la sortie générée. -i pid,hostname masque ces deux éléments des lignes enregistrées et -t yyyy-mm-dd HH:MM:ss formate l'horodatage dans un format facile à utiliser. Essayez ce qui fonctionne pour vous ! La documentation officielle de pino-pretty explique tous les arguments possibles.
Pour démarrer votre bot avec une entrée jolisée, vous exécutez le script dev via le gestionnaire de paquets de votre choix :
npm run devPino est très flexible, supporte les niveaux de journal personnalisés, les threads de travail et de nombreuses autres fonctionnalités. Veuillez consulter la documentation officielle si vous voulez améliorer votre jeu pino ! Ci-dessous, nous montrons une alternative pour une configuration de production. En utilisant ce code, vous enregistrerez les objets json bruts dans un fichier, au lieu de les imprimer dans votre console :
const pino = require('pino');
const transport = pino.transport({
target: 'pino/file',
options: { destination: './log.json' },
});
const logger = pino(transport);
module.exports = logger;i18next
i18next est un cadre d'internationalisation pour JavaScript. Il est avantageux de traduire les messages orients utilisateurs de votre bot dans diverses langues en fonction du serveur sur lequel il est utilisé.
Couvrir un exemple de cas d'utilisation entier pour l'internationalisation serait hors de la portée de ce guide et nécessite une explication plus approfondie sur le fonctionnement du système. Veuillez consulter la documentation officielle liée ci-dessus pour un guide d'utilisation approfondi.