hook-provider_discord.js

const messageQueue = []
let isProcessing = false

/**
 * Function that sends to discord webhook.
 * @async
 * @param {string | number} type - defines what type of log is being sent
 * @param {string | object} text - text or object to be sent to the webhook
 */ 

async function webhookDiscord(type, text) {
  let embedColor
  let typeTxt
  const timeNow = new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})

  if(type === 0) {
    typeTxt = "System"
    embedColor = 16711680
  }
  if(type === 1) {
    typeTxt = "Error"
    embedColor = 16711680
  }
  if(type === 2) {
    typeTxt = "OK"
    embedColor = 65280
  }
  if(type === 3) {
    typeTxt = "Warning"
    embedColor = 16776960
  }
  if(type === 4) {
    typeTxt = "Object"
    embedColor = 255
    text = `\`\`\`json\n${text}\n\`\`\``
  }
  if(!type) {
    typeTxt = "undefined"
    embedColor = 16777215
  }

  messageQueue.push({
    embedColor,
    typeTxt,
    text,
    timeNow
  })
  processQueue()
}

async function processQueue() {
  if (isProcessing || messageQueue.length === 0) return
  isProcessing = true

  while (messageQueue.length > 0) {
    const item = messageQueue[0] 
    const timeNowLog = new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})

    try {
      const response = await fetch(`${global.$ConLogHookURL}`, {
        method: 'post',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          embeds: [
            {
              color: item.embedColor,
              title: `[${item.timeNow}] ${item.typeTxt}`,
              description: item.text,
            },
          ],
        }),
      })

      if (response.status === 429) {
        const retryAfter = (parseInt(response.headers.get('retry-after')) || 1) * 1000
        console.log(`\x1b[90m[${timeNowLog}]\x1b[0m \x1b[33mConLog System, webhook: Rate limited. Waiting ${retryAfter}ms...\x1b[0m`)
        await new Promise(resolve => setTimeout(resolve, retryAfter))
        continue
      }

      if (response.status != 204) {
        console.log(`\x1b[90m[${timeNowLog}]\x1b[0m \x1b[41mConLog System Error, webhook: ${response.statusText}\x1b[0m`)
      }

      messageQueue.shift()
      if (messageQueue.length > 0) {
        await new Promise(resolve => setTimeout(resolve, 500))
      }

    } catch (error) {
      console.log(`\x1b[90m[${timeNowLog}]\x1b[0m \x1b[41mConLog System Error, webhook: ${error}\x1b[0m`)
      messageQueue.shift() 
    }
  }

  isProcessing = false
}

exports.webhookDiscord = webhookDiscord