const path = require('path'); const fs = require('fs'); const fetch = require('node-fetch'); const has = (o, k) => Object.prototype.hasOwnProperty.call(o, k); class Util { constructor() { throw new Error("Class may not be instantiated."); } static readdirRecursive(directory) { const result = []; (function read(directory) { const files = fs.readdirSync(directory); for(const file of files) { const filePath = path.join(directory, file); if(fs.statSync(filePath).isDirectory()) { read(filePath); } else { result.push(filePath); } } }(directory)); return result; } static delayFor(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } static mergeDefault(def, given) { if (!given) return def; for (const key in def) { if (!has(given, key) || given[key] === undefined) { given[key] = def[key]; } else if (given[key] === Object(given[key])) { given[key] = Util.mergeDefault(def[key], given[key]); } } return given; } //Shard Managing static fetchRecommendedShards(token, guildsPerShard = 1000) { if(!token) throw new Error("[util] Token missing."); return fetch("https://discordapp.com/api/v7/gateway/bot", { method: 'GET', headers: { Authorization: `Bot ${token.replace(/^Bot\s*/i, '')}` } }).then((res) => { if (res.ok) return res.json(); throw res; }) .then((data) => data.shards * (1000 / guildsPerShard)); } static makePlainError(err) { return { name: err.name, message: err.message, stack: err.stack }; } } module.exports = Util;