Discord Bot Dev js reply message

Le problème exposé dans ce sujet a été résolu.

Bonjours à tous je suis débutant en développement de bot discord en js et j’ai rencontré un problème lors de la création de mon bot discord que je n’arrive pas à résoudre et où il n’y a pas d’erreur voici mon code :

image.png
image.png

et lorsque que je test directement sur le discord il ne répond pas … xD : image.png

en espérant que quelqu’un puisse trouvé mon erreur et bonne journée a tous :)

Hello,

Peux-tu donner le code sous forme de texte plutôt qu’en image afin de le rendre plus accessible pour tous ?

Tu peux utiliser des balises MarkDown qui vont bien pour le formater et le colorer suivant le langage également.

Ensuite peux-tu décrire ton problème ? Il se passe quoi ? Quel est le comportement attendu ? As-tu essayé d’ajouter des logs et/ou de tester les valeurs à différents niveaux de l’exécution ?

Yes, pas de soucis je te mets sa en format texte :

const Discord = require("discord.js");
const client = new Discord.Client({intents: 32767});
const{ token } = require('./config.json');
console.log("Le bot est en ligne !")

client.on("messageCreate",message => {
    if(message.author.bot) return; //le bot ne reponds pas au autre bot et a lui même
    
    if(message.content === '/!ping'){
         message.reply("Pong !");
    }
    
    if(message.content === "!embed"){
        const embed = new Discord.MessageEmbed()
            .setColor("#1D0339")
            .setTitle("Embed de test")
            .setURL("https://6rilbook.github.io/siterecettes.fr/index.html")
            .setAuthor({name : 'La Teal 6ril'})
            .setDescription("test description")
            .setThumbnail("https://d1fmx1rbmqrxrr.cloudfront.net/zdnet/i/edit/ne/2020/04/cs-go.jpg")
            .addFields(
                {name : "test desc 1", value : "value de la description"},
                {name : "test desc 2", value : "value de la description2"},
                {name : "test3", value : "value3 inline ", inline : true},
                {name : "test4", value : "value4 inline ", inline : true}
            )

            .addField("test solo field","en dev")
            .setImage("https://pic.clubic.com/v1/images/1779144/raw")
            .setTimeStamp()
            .setFooter({text : "La Team 6ril"})
            message.channel.send({embeds: [embed]})
    }
 })



  
client.login(token)

A l’heure actuelle je souhaiterais que lorsque sur mon discord quand j’écris la commande " /!ping " cela me renvoie "Pong !" avec le bout de code suivant :

    if(message.content === '/!ping'){
         message.reply("Pong !");
    }

J’ai regardé de nombreux forum / tuto mais cela ne fonctionne pas, qu’entend tu par "As-tu essayé d’ajouter des logs et/ou de tester les valeurs à différents niveaux de l’exécution ?" des try catch par exemple ?

Tu as essayé en affichant le message sur la sortie standard ?


client.on("messageCreate",message => {
    console.log(message);
    if(message.author.bot) return; //le bot ne reponds pas au autre bot et a lui même
    
    if(message.content === '/!ping'){
         message.reply("Pong !");
    }

Quand tu lances le bot, tu as bien le message : Le bot est en ligne ! ?

Ensuite, je ne connais pas bien Discord.js, mais ton code diffère légèrement du code de base donné dans le guide (la documentation bugge un peu).

Tu devrais ajouter :


// When the client is ready, run this code (only once)
client.once('ready', () => {
	console.log('Ready!');
});

Avant : client.login(token). Comme ça, on saurait si c’est une erreur dût à l’initialisation du bot (ce que je suspecte le plus). C’est possible qu’en trouvant d’anciens codes sur internet tu aies un code adapté à une ancienne version de Discord.js et que tu utilises désormais une version plus récente. Le mieux est de codé pour la nouvelle version en lisant le Guide officiel (mise à jour donc) et la documentation (forcément à jour également).

Edit: Je ne sais pas pourquoi je n’arrive pas à charger la documentation, mais le guide écoute l’évènement interactionCreate plutôt que messageCreate. Bon, y a également une référence à messageCreate donc je ne pense pas que ça soit le problème mais ça vaut le coup d’essayer également.

+0 -0

Non tu ne comprends pas.
Ce que je te demande c’est de nous donner la sortie standard de ton bot.

C’est à dire ce qu’il affiche quand tu le lances. Ce n’est pas parce-que les tutoriels ne remontent qu’à quelques jours que cette partie fonctionne.

De me confirmer qu’il affiche bien Le bot est en ligne ! quand tu fais npm run start ou node index.js ou peu importe comment tu lances ton bot. De même avec Ready! quand tu rajoutes le bout de code que je t’ai proposer de rajouter, le onready.

+0 -0

Je vais essayer de t’expliquer l’approche qu’on essaie de prendre et pourquoi on te parle de ce log. Quand on regarde ton code, rien ne saute aux yeux comme étant mal fait ou qui expliquerait pourquoi ça ne fonctionne pas. Donc plutôt que de continuer à regarder ce code et réfléchir très fort à des raisons alambiquées pouvant expliquer ton problème, il est plus simple de d’abord obtenir plus d’information.

Tout d’abord, tu nous as montré que la ligne "Le bot est en ligne" est bien loggée ce qui a permis d’écarter l’hypothèse que ton bot ne démarrait pas bien.

Maintenant, on aimerait obtenir une meilleure idée de quelle étape échoue. Le bot lit-il bien correctement les messages postés sur Discord ? Pour le savoir, on va ajouter un ligne console.log(...) au tout début de client.on("messageCreate",message => {...}. Si ce message ne s’affiche pas, rien ne sert de regarder plus loin dans ton code. Par contre, s’il s’affiche, il faudra continuer ce procédé. On pourra par exemple ajouter une ligne de log dans if(message.content === '/!ping'){...} afin de voir si le bot comprend bien lorsqu’une commande /!ping est envoyée et ainsi de suite.

Ici, on fait les choses pas à pas car on essaie de t’aider petit à petit mais quand tu fais ça en pratique, avec l’expérience, tu peux mettre toutes ces lignes de log d’un coup et "tout débugger" en une étape pour gagner du temps.

Bon pour être franc, je pense que ton problème est que tu n’utilises pas les commandes mais que tu essayes de lire les messages directement.
Ça m’a l’air plus compliqué de lire les messages que de répondre à une commande et ça ne m’a pas l’air adapter également. Si tu utilises bien les commandes alors as-tu fait cette étape ? Registering commands

Aussi, à l’étape Bot invite links tu es sûr d’avoir coché “Send messages” ?
Moi j’ai coché ça :

Simple Discord bot - URL generator page

Et avec ce code ça passe très bien :

const {Client, GatewayIntentBits } = require('discord.js');
const {token} = require('./token.json');

const client = new Client({intents: [GatewayIntentBits.Guilds]});

client.once('ready', () => {
  console.log('Ready !');
});

client.on('interactionCreate', async interaction => {
	if (!interaction.isChatInputCommand()) return;

	const { commandName } = interaction;

	if (commandName === 'ping') {
		await interaction.reply('Pong !');
	}
});

client.login(token);

Mon bot répond correctement Pong !.

Ping ! Pong ! image.png

Par-contre, il faut bien penser à enregistrer la commande comme décrit dans le guide de Discord.js.
Si tu ne souhaitais pas utiliser les commandes alors je t’invite fortement à le faire, car juste, ça marche quoi. Je chercherais un autre jour pour qu’un bot aie accès aux messages d’un serveur discord, pour l’instant les commandes semblent suffire.

PS: S’il te plaît, j’essaye de faire une réponse construite, ne me répond pas juste que tu as essayé et que ça ne marche pas. Si ça ne marche pas, donne nous exactement ce que tu as essayé et ce que tu obtiens.

Mon fichier token.js ressemble à ça :

{
	"clientId": "1111111111111111122",
	"guildId": "111100111144111155",
	"token": "MTAWWWUWWWgZZZZZZZZZZZZZA.ACHENI.CEo_BOOSbZZZZZ_ZZZZZZZZZZZZZZZZZZZZZZZZZ"
}

J’ai bien-sûr remplacer les valeurs par des données à peu prêt aléatoire.

+0 -0

Déjà je voudrais vous remerciez pour l’aide que vous m’apportez malgré que je galère xD j’apprends grâce a vous ^^,

Ensuite comme tu me la conseiller j’ai rajouter un console.log au tout début comme tu me la demandé :image.png

ce qui me donne le message suivant dans log :

Client {_events: {…}, _eventsCount: 2, _maxListeners: undefined, options: {…}, rest: REST, …}
_events:
{shardDisconnect: ƒ, messageCreate: ƒ}
_eventsCount:
2
_maxListeners:
undefined
actions:
ActionsManager {client: Client, ApplicationCommandPermissionsUpdate: ApplicationCommandPermissionsUpdateAction, ChannelCreate: ChannelCreateAction, ChannelDelete: ChannelDeleteAction, ChannelUpdate: ChannelUpdateAction, …}
application:
ClientApplication {id: '989135928914247710', name: null, description: null, icon: null, tags: Array(0), …}
channels:
ChannelManager {client: Client, holds: ƒ, _cache: Map(49)}
emojis:
ƒ emojis() {\n    const emojis = new BaseGuildEmojiManager(this);\n    for (const guild of this.guilds.cache.values()) {\n      if (guild.available) for (const emoji of guild.emojis.cache.values()) emojis.cache.set(emoji.id, emoji);\n    }\n    return emojis;\n  }
guilds:
GuildManager {client: Client, holds: ƒ, _cache: Map(1)}
options:
{intents: 32767, closeTimeout: 5000, waitGuildTimeout: 15000, shardCount: 1, makeCache: ƒ, …}
presence:
ClientPresence {userId: null, guild: null, status: 'online', activities: Array(0), clientStatus: null, …}
readyAt:
ƒ readyAt() {\n    return this.readyTimestamp && new Date(this.readyTimestamp);\n  }
readyTimestamp:
1659365645533
rest:
REST {_events: {…}, _eventsCount: 2, _maxListeners: undefined, cdn: CDN, requestManager: _RequestManager, …}
shard:
null
sweepers:
Sweepers {options: {…}, intervals: {…}, client: Client}
Symbol(kCapture):
true
uptime:
ƒ uptime() {\n    return this.readyTimestamp && Date.now() - this.readyTimestamp;\n  }
user:
ClientUser {id: 'monid', bot: true, system: false, flags: UserFlagsBitField, username: '6ril Bot', …}

Ensuite ache quand j’ai importé mon bot je lui est mis les droit administrateur donc je ne pense pas que dans le cas échéant se soit le problème.

Ensuite le Registering commands je l’ai fait mais je ne suis pas vraiment sûre si il est correct, j’ai repris sur les docs le voici :

const { SlashCommandBuilder, Routes } = require('discord.js');
const { REST } = require('@discordjs/rest');
const { clientId, guildId, token } = require('./config.json');

const commands = [
	new SlashCommandBuilder().setName('ping').setDescription('Replies with pong!'),
	new SlashCommandBuilder().setName('server').setDescription('Replies with server info!'),
	new SlashCommandBuilder().setName('user').setDescription('Replies with user info!'),
]
	.map(command => command.toJSON());

const rest = new REST({ version: '10' }).setToken(token);

rest.put(Routes.applicationGuildCommands(clientId, guildId), { body: commands })
	.then(() => console.log('Successfully registered application commands.'))
	.catch(console.error);

ton bot ache répond correctement Pong ! j’ai donc essayé avec ton code ( sait on jamais xD ) mais rien ne change pas de réponse est ce que cela vient du fichier deploy-commands.js ?

enfin mon fichier token.js ressemble exactement au tiens ( mis a part qu’il s’appelle config.json )avec les bonnes valeurs.

J’essaye d’expliquer au mieux mes problèmes :) et merci pour votre aide <3

+0 -0

Je crois que tu n’as pas fait attention à la position du console.log : il faut le mettre dans la fonction qui traite l’événement, pas autour du bloc de listener.

Tu as même l’exemple dans ce message de @ache de ce que ça peut donner.


Au passage, fais attention avec les images : certaines personnes ne peuvent pas les voir et donc en connaître le contenu. S’il s’agit de poster du code, fais-le avec du texte formaté qui sera accessible au plus grand nombre.

autant pour moi :)

image.png
image.png

en effet quand je fait donc la commande /!ping :

image.png
image.png

dans le serveur discord j’obtiens ceci dans les logs :

Message {channelId: '1003680110219644981', guildId: '1003680109322051594', id: '1003684730589421681', createdTimestamp: 1659367487333, type: 0, …}

(je suppose que c’est la partie la plus intéressante des logs ) mais au cas ou je met tous ici :

activity:
null
applicationId:
null
attachments:
Map(0) {size: 0}
author:
<@345526347596169226>
channel:
ƒ channel() {\n    return this.client.channels.resolve(this.channelId);\n  }
channelId:
'1003680110219644981'
cleanContent:
ƒ cleanContent() {\n    // eslint-disable-next-line eqeqeq\n    return this.content != null ? cleanContent(this.content, this.channel) : null;\n  }
components:
(0) []
content:
''
createdAt:
ƒ createdAt() {\n    return new Date(this.createdTimestamp);\n  }
createdTimestamp:
1659367487333
crosspostable:
ƒ crosspostable() {\n    const bitfield =\n      PermissionFlagsBits.SendMessages |\n      (this.author.id === this.client.user.id ? PermissionsBitField.DefaultBit : PermissionFlagsBits.ManageMessages);\n    const { channel } = this;\n    return Boolean(\n      channel?.type === ChannelType.GuildNews &&\n        !this.flags.has(MessageFlags.Crossposted) &&\n        this.type === MessageType.Default &&\n        channel.viewable &&\n        channel.permissionsFor(this.client.user)?.has(bitfield, false),\n    );\n  }
deletable:
ƒ deletable() {\n    if (!this.guild) {\n      return this.author.id === this.client.user.id;\n    }\n    // DMChannel does not have viewable property, so check viewable after proved that message is on a guild.\n    if (!this.channel?.viewable) {\n      return false;\n    }\n\n    const permissions = this.channel?.permissionsFor(this.client.user);\n    if (!permissions) return false;\n    // This flag allows deleting even if timed out\n    if (permissions.has(PermissionFlagsBits.Administrator, false)) return true;\n\n    return Boolean(\n      this.author.id === this.client.user.id ||\n        (permissions.has(PermissionFlagsBits.ManageMessages, false) &&\n          this.guild.members.me.communicationDisabledUntilTimestamp < Date.now()),\n    );\n  }
editable:
ƒ editable() {\n    const precheck = Boolean(this.author.id === this.client.user.id && (!this.guild || this.channel?.viewable));\n    // Regardless of permissions thread messages cannot be edited if\n    // the thread is locked.\n    if (this.channel?.isThread()) {\n      return precheck && !this.channel.locked;\n    }\n    return precheck;\n  }
editedAt:
ƒ editedAt() {\n    return this.editedTimestamp && new Date(this.editedTimestamp);\n  }
editedTimestamp:
null
embeds:
(0) []
flags:
MessageFlagsBitField {bitfield: 0}

enfin mon fichier token.js ressemble exactement au tiens ( mis a part qu’il s’appelle config.json )avec les bonnes valeurs.

👍

ton bot ache répond correctement Pong ! j’ai donc essayé avec ton code ( sait on jamais xD ) mais rien ne change pas de réponse est ce que cela vient du fichier deploy-commands.js ?

C’est possible, ou alors des droits accordés au bot.

Ah donc toi tu utilises correctement les messages !
C’est une bonne chose. Moi j’utilisais les commandes, c’est différent et plus simple. Mais les messages, c’est clairement plus puissant et plus versatile.
En fonction de ce que tu veux faire ça peu être intéressant.

Pour ton problème, j’ai cherché rapidement sur internet et tu as ça :

message.content doesn’t have any value in Discord.js v14

Qui dit grossièrement qu’il y a une option explicite pour activer la valeur content lorsque tu reçois un message. Ce qui explique ton problème.

Direction: Developer portal Puis Applications -> Settings (à gauche quoi) -> Bot -> Privileged Gateway Intents (à droite) -> Section Message Content Intent.

Oh ! Et j’oublieais. Il faut rajouter l'intent ad-hoc. Aussi.

Bravo ! Après ça, ça marchera. ^^

À partir du moment où tu as le log que tu nous montre, c’est que tu fais à peu prêt tout comme il faut. ^^
À peu prêt, forcément, puisque ça ne marche pas. 😝

+0 -0

[EDIT] Ah ben forcément ache ajoute la même info pendant que je poste 🙃

On est complémentaire. x)

+0 -0

À la place de :

const Discord = require("discord.js");
const client = new Discord.Client({intents: 32767});

Essaye :

const Discord = require("discord.js");
const client = new Discord.Client({
  'intents': [
    Discord.GatewayIntentBits.DirectMessages,
    Discord.GatewayIntentBits.Guilds,
    Discord.GatewayIntentBits.GuildMessages
  ]
});
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte