user-storage.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. const fs = require('await-file')
  2. const Path = require('path')
  3. const { Snowflake } = require('discord.js')
  4. const storageDirectory = './users'
  5. const userDirectory = user => Path.join(storageDirectory, `${user.id}`)
  6. const userIndexFile = user => Path.join(userDirectory(user), 'index.json')
  7. const userStateFile = (user, snowflake) => Path.join(userDirectory(user), `${snowflake}.json`)
  8. const ensureUserDirectory = async user => {
  9. if (!await fs.exists(userDirectory(user))) {
  10. await fs.createDirectory(userDirectory(user))
  11. }
  12. }
  13. const getIndex = async user => {
  14. if (await fs.exists(userIndexFile(user)))
  15. return JSON.parse(await fs.readFile(userIndexFile(user), 'utf8'))
  16. return {}
  17. }
  18. const setIndex = async (user, index) => {
  19. await ensureUserDirectory(user)
  20. await fs.writeFile(userIndexFile(user), JSON.stringify(index))
  21. }
  22. const get = async (user) => {
  23. const index = await getIndex(user)
  24. if (!index.latest) return {}
  25. return JSON.parse(await fs.readFile(userStateFile(user, index.latest)))
  26. }
  27. const set = async (user, object) => {
  28. const json = JSON.stringify(object)
  29. await ensureUserDirectory(user)
  30. const index = await getIndex(user)
  31. index.latest = Snowflake.generate()
  32. await fs.writeFile(userStateFile(user, index.latest), json)
  33. await setIndex(user, index)
  34. }
  35. module.exports = {
  36. get,
  37. set,
  38. getIndex,
  39. setIndex,
  40. storageDirectory,
  41. userDirectory,
  42. userIndexFile,
  43. userStateFile,
  44. ensureUserDirectory
  45. }