Estoy tratando de hacer un bot de discordia. Quiero que obtenga una API cada X segundos y verifique los nuevos temas creados.
La API JSON contiene solo un objeto, la última publicación en el sitio. Quería que el bot buscara cada X segundos y si la última publicación encontrada tiene un uid más grande para enviar un mensaje en un canal. Si no, no hagas nada. El uid es un número.
Intenté usar la función setInterval pero no pude hacer que funcionara, ya que dio errores que aguardan debe estar en una función asíncrona superior.
También codifiqué el último uid de publicación "latest_post" y la forma en que vi que funciona es si post_id de la API es más alto que el codificado, entonces el codificado recibe el valor del nuevo. Sin embargo, el valor de last_post permanece sin cambios ya que la función se ejecuta nuevamente y late_post está codificado de forma rígida cada vez. Intenté declararlo fuera de la función pero salió como indefinido.
Este es mi código actual casi funcional .
client.on('messageCreate', async (message) => { if (!message.content.startsWith(prefix) || message.author.bot) return; const args = message.content.slice(prefix.length).split(/ +/); const command = args.shift().toLowerCase(); if (command === 'new') { var latest_post = 12345; // hardcoded latest post uid try { const response = await fetch('API HERE').then(r => r.text()); const body = JSON.parse(response); const obj = body.data; const objId = obj[0].post_id; const objAuthor = obj[0].author; const objTitle = obj[0].title; if (objTopic > latest_post) { client.channels.cache.get("CHANNEL ID").send(`Found a new post by ${objAuthor}`); var latest_post = objId; // if it fetches a post with a higher uid then latest_post receives the value of that higher uid } else { var d = new Date(); var n = d.toLocaleTimeString(); console.log(`No new posts yet at ${n}`); //logs "No new posts yet at 1:30 PM" } } catch (error) { message.channel.send('Oops, there was an error fetching the API'); console.log(error); } } });¿Alguien puede guiarme sobre cómo transformar esto en una función recursiva que se ejecuta automáticamente cada X segundos? Gracias !
Después de algunas iteraciones logré que funcionara como yo quería. Dejaré el código a continuación, ¡espero que ayude!
let refreshint = 10 * 1000; //10 seconds var API = "API_HERE"; client.on('ready', async (message) => { console.log('Bot is connected...'); var latest_post = 12345 // hardcoded latest post uid setInterval(async function(){ try { const response = await fetch('API').then(r => r.text()); const body = JSON.parse(response); const obj = body.data; const objId = obj[0].post_id; const objAuthor = obj[0].author; const objTitle = obj[0].title; if (objTopic > latest_post) client.channels.cache.get("CHANNEL ID").send(`Found a new post by ${objAuthor}`); console.log(`Found a new post by ${objAuthor}`); function change_value(latest_post){ return latest_post; } latest_post = change_value(topicId); } else { var d = new Date(); var n = d.toLocaleTimeString(); console.log(`No new thread yet at ${n}`); } } catch (error) { message.channels.cache.get('channel ID here').send('Oops, there was an error fetching the API'); console.log(error); } }, refreshint) });