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*/iu, '')}` } }).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 }; } static escapeMarkdown(text, onlyCodeBlock = false, onlyInlineCode = false) { if(onlyCodeBlock) return text.replace(/```/gu, '`\u200b``'); if(onlyInlineCode) return text.replace(/\\(`|\\)/gu, '$1').replace(/(`|\\)/gu, '\\$1'); return text.replace(/\\(\*|_|`|~|\\)/gu, '$1').replace(/(\*|_|`|~|\\)/gu, '\\$1'); } } module.exports = Util;