Où envoyer
| Fonction | Effet | Permission |
|---|---|---|
ctx.reply(contenu, { public }) | Répond à la commande, au clic ou au formulaire. Visible par la personne seule, sauf { public: true }. | — |
ctx.send(salon, contenu) | Envoie dans un salon. Renvoie le message (id, channelId, url). | messages.send |
ctx.dm(membre, contenu) | Message privé. Renvoie false si ses MP sont fermés. | messages.dm |
ctx.edit(contenu) | Modifie le message du bouton ou du menu utilisé. | — |
ctx.followUp(contenu, { public }) | Ajoute un message après la première réponse. | — |
ctx.defer({ public }) | « Opale réfléchit… » : à faire avant un travail long. | — |
ctx.editReply(contenu) | Remplace la première réponse (après defer). | — |
ctx.deleteReply() | Supprime la première réponse. | — |
Le contenu
Texte
await ctx.reply('Bonjour **' + ctx.member.name + '** !');Carte
Un objet avec title, color, image, thumbnail, infos, list ou footer devient une carte (Components V2).
await ctx.send(ctx.config.salon, {
title: 'Nouveau tournoi',
text: 'Inscriptions ouvertes jusqu’à vendredi.',
color: '#c38eb4',
image: 'https://exemple.com/affiche.png',
infos: [
{ label: 'Jeu', value: 'Rocket League' },
{ label: 'Format', value: '2 contre 2' },
],
list: [{ label: 'Règlement', value: '- Pas de triche\n- Fair-play' }],
footer: 'Organisé par ' + ctx.member.name,
buttons: [{ id: 'inscrire', label: 'S’inscrire', style: 'success' }],
links: [{ label: 'Site du tournoi', url: 'https://exemple.com' }],
});| Champ | Rôle |
|---|---|
text | Le texte principal |
title | Le titre |
color | Couleur de la bordure : #RRGGBB |
image | Grande image (https) |
thumbnail | Petite image en haut à droite (https) |
infos | Lignes « libellé · valeur » (15 max) |
list | Blocs « titre + texte » séparés (10 max) |
footer | Petit texte en bas |
buttons | Boutons d’action (5 max) : voir Composants |
links | Boutons de lien (5 au total avec les boutons) |
select | Un menu de choix |
pingRoles | Rôles à notifier (5 max) |
Message brut Discord
Un objet avec content, embeds, components, poll ou files est envoyé tel quel, au format de l’API Discord. Tu as alors accès à tout : embeds, composants V2, sondages natifs, fichiers.
await ctx.reply({
embeds: [{
title: 'Météo',
description: '☀️ Ciel dégagé',
color: 0x86a8cf,
fields: [{ name: 'Température', value: '21 °C', inline: true }],
}],
}, { public: true });
await ctx.send(ctx.config.salon, {
poll: {
question: { text: 'Pizza ou burger ?' },
answers: [{ poll_media: { text: 'Pizza', emoji: { name: '🍕' } } }, { poll_media: { text: 'Burger', emoji: { name: '🍔' } } }],
duration: 24,
},
});
await ctx.reply({ content: 'Voici l’export', files: [{ name: 'membres.csv', text: 'nom;jours\nLina;12' }] });| Fichier | Format |
|---|---|
text | Contenu texte |
base64 | Contenu binaire (image…) en base64 |
| Limites | 10 fichiers, 10 Mo par message |
Réponses longues
module.command('rapport', async (ctx) => {
await ctx.defer();
const liste = await ctx.collection('ventes').list({ limit: 200 });
await ctx.editReply(liste.total + ' ventes enregistrées.');
});Mentions
Sans la permission « messages.everyone », @everyone, @here et les rôles non mentionnables ne notifient personne. Les membres mentionnés sont notifiés normalement (sauf dans une carte).