import { Client } from "discord.js"; import axios from "axios"; import moment from "moment"; import path, { join } from "path"; import { Low, JSONFile } from "lowdb"; import dotenv from "dotenv"; import schedule from "node-schedule"; dotenv.config(); const __dirname = path.resolve(); // Use JSON file for storage const file = join(__dirname, "db.json"); const adapter = new JSONFile(file); const db = new Low(adapter); const client = new Client(); // Read data from JSON file, this will set db.data content await db.read(); // If file.json doesn't exist, db.data will be null // Set default data // db.data |= { config: [] }; // db.write(); //INIT client.on("ready", () => { console.log(`Logged in as ${client.user.tag}!`); _init(); }); const _init = async () => { const channel = client.channels.cache.find( (channel) => channel.name === "storage-provider" ); const job = schedule.scheduleJob("0 */2 * * *", async function (fireDate) { const response = await generateSize(); channel.send(`Current storage size: ${response}`); }); }; //UTILS const generateSize = async () => { let res; const isOld = isCacheOld(); if (isOld) { res = await getSizeFromJoystream(); } let size = isOld ? res : db.data.config[0].size; return Promise.resolve(size); }; const generateMsg = async (msg = "", user = "") => { let size = await generateSize(); msg && msg.edit(`<@${user.id}>, Current storage size: ${size}`); }; const bytesToSize = (bytes) => { const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; if (bytes === 0) return "n/a"; const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10); if (i === 0) return `${bytes} ${sizes[i]}`; return `${(bytes / 1024 ** i).toFixed(1)} ${sizes[i]}`; }; const getSizeFromJoystream = async () => { return axios .get( "https://analytics.dapplooker.com/api/public/dashboard/c70b56bd-09a0-4472-a557-796afdc64d3b/card/155?parameters=%5B%5D" ) .then((response) => { // handle success // const res = bytesToSize(response.data.media.size); const res = Math.round(response.data.data.rows[0][0] / 1000) + "GB"; db.data.config[0] = { timeStamp: moment.utc().format(), size: `${res}` }; db.write(); return res; }) .catch((error) => { // handle error console.log(error); }); }; const isCacheOld = () => { let lastTime = db.data.config[0].timeStamp; console.log(JSON.stringify(lastTime)); if (lastTime) { const today = moment(); const diff = today.diff(lastTime, "minutes"); console.log(diff); return diff > 120 ? true : false; } return true; }; // COMMANDS client.on("message", async (msg) => { const user = msg.author; if (msg.content === "/storagesize") { msg .reply("Calculating... ") .then(async (oldMessage) => { generateMsg(oldMessage, user); }) .catch((error) => { console.log(error); }); } }); client.login(process.env.TOKEN);