'use strict'; const config = require('config'); const fetch = require('node-fetch'); async function fetchPredata() { const data = { limit: 0, remaining: 0, }; data.setRemaining = (remaining) => { data.remaining = remaining; }; const res = await fetch('https://api.imgur.com/3/credits', { headers: { Authorization: `Client-ID ${config.methods.imgur.clientId}`, }, }); if (res.ok) { const body = await res.json(); if (body.success) { data.limit = body.data.UserLimit; data.remaining = body.data.UserRemaining; } } return data; } async function imgurImageApi(host, post, { predata }) { if (predata.remaining === 10) { // keep a buffer throw new Error(`Reached Imgur API rate limit with source '${host.url}'`); } const res = await fetch(`https://api.imgur.com/3/image/${host.id}`, { headers: { Authorization: `Client-ID ${config.methods.imgur.clientId}`, }, }); const rateRemaining = Number(res.headers.get('x-ratelimit-userremaining')); if (rateRemaining) { predata.setRemaining(rateRemaining); } if (!res.ok) { throw new Error(`Imgur API returned HTTP ${res.status} for source '${host.url}'`); } const { data } = await res.json(); if (res.status !== 200) { throw new Error(`Could not fetch info for imgur image '${host.id}': ${data.error}`); } return { album: null, items: [{ id: data.id, url: data.animated ? data.mp4 : data.link, title: data.title, description: data.description, type: data.animated ? 'video/mp4' : data.type, datetime: new Date(data.datetime * 1000), original: data, }], }; } async function imgurImage(host, post, context) { return imgurImageApi(host, post, context); } module.exports = { fetchInfo: imgurImage, fetchPredata, };