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