JavaScript - Interacción simple de bot por DM

 
Vista:
sin imagen de perfil

Interacción simple de bot por DM

Publicado por Javier (1 intervención) el 10/08/2023 12:29:19
Buenas. Estoy intentando crear un bot para Discord con node.js y discord.js v14. Llevo ya unos días atascado con algo que en principio debería resultar sencillo pero que no consigo resolver, mayormente por mi inexperiencia con este lenguaje.
Básicamente, lo que busco es conseguir que cuando un usuario le hable por DM al bot el resultado sea este:
(El texto del usuario es indiferente, no hay que buscar palabras clave)
-Mensaje-1 usuario
-Mensaje-1 bot
--Espera durante 1m respuesta, si no contesta -> Mensaje-4
-Mensaje-2 usuario
-Mensaje-2 bot
--Espera durante 1m respuesta, si no contesta -> Mensaje-4
-Mensaje-3 usuario
-Mensaje-3 bot
--Espera durante 1m respuesta, si no contesta -> Mensaje-4

Lo he intentado de varias formas, pero o bien el bot siempre responde con el Mensaje-1 a todas las interacciones, o responde con la 1+ la 2, la 1 +3 etc, nunca consigo que funcione correctamente.
Pongo un par de códigos que he probado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const replies = [
  "Respuesta inicial al primer mensaje.",
  "Respuesta a cualquier respuesta subsiguiente.",
  "Tercera respuesta.",
  "Cuarta respuesta."
];
 
const userStates = new Map(); // Mapa para almacenar el estado de los usuarios
 
  if (!message.guild && !message.author.bot) {
    if (!userStates.has(message.author.id)) {
      // Respuesta al primer mensaje de un usuario
      message.reply(replies[0]);
      userStates.set(message.author.id, 1);
    } else {
      const state = userStates.get(message.author.id);
      if (state < replies.length) {
        // Esperar la respuesta del usuario
        const filter = response => response.author.id === message.author.id;
        const collector = message.channel.createMessageCollector({ filter, time: 60000 }); // Espera 60 segundos
 
        collector.on('collect', (response) => {
          const nextState = userStates.get(message.author.id);
          if (nextState < replies.length) {
            message.reply(replies[nextState]);
            userStates.set(message.author.id, nextState + 1);
          }
 
          collector.stop(); // Detiene el colector después de la respuesta
        });
 
        collector.on('end', (collected, reason) => {
          if (reason === 'time') {
            if (userStates.has(message.author.id)) {
              userStates.delete(message.author.id); // Elimina el estado del usuario si se acaba el tiempo
            }
          }
        });
      }
    }
  }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (!message.guild && !message.author.bot) {
 message.reply("Ahora mismo estoy liado...").then((initialReply) => {
    const filter = response => !response.author.bot;
 
    message.channel
      .awaitMessages({ filter, max: 1, time: 30000, errors: ["time"] })
      .then((collected) => {
        if (collected.size > 0) {
          initialReply.delete(); // Elimina la respuesta inicial del bot
          message.channel.send('Que parte de "Ahora mismo estoy liado..." no entiendes?');
        } else {
          message.channel.send("Así me gusta");
        }
      })
      .catch(() => {
        message.channel.send("Así me gusta");
      });
  });
}
}

A ver si alguien puede echarme un cable.
Un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder