const fs = require('await-file') const Path = require('path') const { Snowflake } = require('discord.js') const storageDirectory = './users' const userDirectory = user => Path.join(storageDirectory, `${user.id}`) const userIndexFile = user => Path.join(userDirectory(user), 'index.json') const userStateFile = (user, snowflake) => Path.join(userDirectory, `${snowflake}.json`) const ensureUserDirectory = async user => { if (!await fs.exists(userDirectory(user))) { await fs.createDirectory(userDirectory(user)) } } const getIndex = async user => { if (await fs.exists(userIndexFile(user))) return JSON.parse(await fs.readFile(userIndexFile(user), 'utf8')) return {} } const setIndex = async (user, index) => { await ensureUserDirectory(user) await fs.writeFile(userIndexFile(user), JSON.stringify(index)) } const get = async (user) => { const index = await getIndex(user) if (!index.latest) return {} return JSON.parse(await fs.readFile(userStateFile(index.latest))) } const set = async (user, object) => { const json = JSON.stringify(object) await ensureUserDirectory(user) const index = await getIndex(user) index.latest = Snowflake.generate() await fs.writeFile(userStateFile(index.latest), json) await setIndex(user, index) } module.exports = { get, set, getIndex, setIndex, storageDirectory, userDirectory, userIndexFile, userStateFile, ensureUserDirectory }