Files
metrics/source/plugins/community/crypto/index.mjs
2023-10-07 15:44:19 +02:00

74 lines
1.9 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)
}
}