Files
metrics/source/plugins/community/crypto/index.mjs
github-actions[bot] a53a5853a9 chore: code formatting
2023-11-14 02:26:48 +00:00

70 lines
1.8 KiB
JavaScript

//Setup
export default async function({login, q, imports, data, account}, {enabled = false, extras = false} = {}) {
//Plugin execution
try {
//Check if plugin is enabled and requirements are met
if ((!q.crypto) || (!imports.metadata.plugins.crypto.enabled(enabled, {extras})))
return null
//Load inputs
let {id, days, vs_currency, precision} = imports.metadata.plugins.crypto.inputs({data, account, q})
if (!id)
throw {error: {message: "Crypto currency id is not set"}}
console.debug(`metrics/compute/${login}/plugins > crypto > querying api for crypto`)
const {
data: coin,
} = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}`, {
params: {
market_data: true,
},
})
if (!coin)
throw {error: {message: "Crypto currency not found"}}
const {
data: {prices},
} = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}/market_chart`, {
params: {
vs_currency,
days,
precision,
},
})
const chart = imports.Graph.timeline(
prices.map((y, _) => ({x: new Date(y[0]), y: y[1]})),
{
low: Math.min(...prices.map((y, _) => y[1])),
high: Math.max(...prices.map((y, _) => y[1])),
points: false,
text: false,
width: 480 * (1 + data.large),
height: 200,
},
)
//Results
return {
chart,
id,
precision,
days: {"1": "Today", "14": "2 Weeks", "30": "1 Month", max: "All-time"}[days],
symbol: coin.symbol,
name: coin.name,
current_price: coin.market_data.current_price[vs_currency],
price_change_percentage_24h: coin.market_data.price_change_percentage_24h,
vs_currency,
logo: coin.image.small,
}
}
//Handle errors
catch (error) {
throw imports.format.error(error)
}
}