emily workin on the redis module

This commit is contained in:
Emily 2020-10-09 16:04:28 +11:00
parent dba47edf04
commit 7c414c9571

View file

@ -1,18 +1,15 @@
'use strict'
// TODO IN REDIS DATABASE MODULE: Find a better way to store arrays/objects
const Database = require('../../base/database')
const redis = require('redis') const redis = require('redis')
const { promisify } = require('util') const generators = require('redis-async-gen');
const generators = require('redis-async-gen') const { data } = require('./logger');
const { promisify } = require('util');
class RedisDatabase extends Database { class Redis {
constructor(client) { constructor(client) {
super(client) this.client = client;
// Config }
let conf = this.client.config.redis
init () {
const conf = this.client.config.redis
// Create redis client // Create redis client
this.global = redis.createClient(conf) this.global = redis.createClient(conf)
@ -20,179 +17,94 @@ class RedisDatabase extends Database {
this.member = this.global.duplicate({ db: 2 }) this.member = this.global.duplicate({ db: 2 })
this.user = this.global.duplicate({ db: 3 }) this.user = this.global.duplicate({ db: 3 })
// Async // Promises
this.guildGetAsync = promisify(this.guild.get).bind(this.guild) this.guildGetAsync = promisify(this.guild.hget).bind(this.guild)
this.memberGetAsync = promisify(this.member.get).bind(this.member) this.memberGetAsync = promisify(this.member.hget).bind(this.member)
this.userGetAsync = promisify(this.user.get).bind(this.user) this.userGetASync = promisify(this.user.hget).bind(this.user)
this.guildSetAsync = promisify(this.guild.set).bind(this.guild) this.guildGetAllAsync = promisify(this.guild.hgetall).bind(this.guild)
this.memberSetAsync = promisify(this.member.set).bind(this.member) this.memberGetAllAsync = promisify(this.member.hgetall).bind(this.member)
this.userSetAsync = promisify(this.user.set).bind(this.user) this.userGetAllAsync = promisify(this.user.hgetall).bind(this.user)
// Generators this.guildSetAsync = promisify(this.guild.hset).bind(this.guild)
this.guildGenerators = generators.using(this.guild) this.memberSetAsync = promisify(this.member.hset).bind(this.member)
this.memberGenerators = generators.using(this.member) this.userSetAsync = promisify(this.user.hset).bind(this.user)
this.userGenerators = generators.using(this.user) };
}
async userExists(id) { async guildGet (id, key) {
for await (const key of this.userGenerators.keysMatching(id + '-*')) { let result = await this.client.db.guildGetAsync(id, key);
return true
}
for await (const key of this.memberGenerators.keysMatching('*-' + id + '-*')) {
return true
}
return false
}
async memberExists(guildId, id) {
for await (const key of this.memberGenerators.keysMatching(guildId + '-' + id + '-*')) {
return true
}
return false
}
async guildExists(id) {
for await (const key of this.guildGenerators.keysMatching(id + '-*')) {
return true
}
return false
}
async createUser(id) {
// No need to create users with all the data in Redis
}
async createMember(guildId, id) {
// No need to create members with all the data in Redis
}
async createGuild(id) {
// No need to create guilds with all the data in Redis
}
async getUser(id) {
let db = this
return new function() {
this.id = id
this.db = db
this.get = async function(key) {
let result = await this.db.userGetAsync(this.id + '-' + key)
if(result === null) { if(result === null) {
return this.db.client.config.defaultUserData[key] result = this.client.config.defaultGuildData[key]
} else {
if(String(result).startsWith('[') || String(result).startsWith('{')) return JSON.parse(result)
return result if (!result) {
throw new Error('The key provided is invalid. Please check for typing errors.')
} }
} }
this.set = async function(key, value) { return result;
if(typeof(value) === 'object') value = JSON.stringify(value)
return await this.db.userSetAsync(this.id + '-' + key, value)
} }
this.delete = async function() { async guildSet (id, key, newValue) {
return await this.db.deleteUser(this.id) if (newValue === this.client.config.defaultGuildData[key]) {
}
} }
} }
async getMember(guildId, id) { async memberGet (id, key) {
let db = this let result = await this.client.db.memberGetAsync(id, key);
return new function() {
this.guildId = guildId
this.id = id
this.db = db
this.get = async function(key) {
let result = await this.db.memberGetAsync(this.guildId + '-' + this.id + '-' + key)
if(result === null) { if(result === null) {
return this.db.client.config.defaultMemberData[key] result = this.client.config.defaultMemberData[key]
} else {
if(String(result).startsWith('[') || String(result).startsWith('{')) return JSON.parse(result)
return result if (!result) {
throw new Error('The key provided is invalid. Please check for typing errors.')
} }
} }
this.set = async function(key, value) { return result;
if(typeof(value) === 'object') value = JSON.stringify(value)
return await this.db.memberSetAsync(this.guildId + '-' + this.id + '-' + key, value)
} }
this.delete = async function() { async userGet (id, key) {
return await this.db.deleteMember(this.guildId, this.id) let result = await this.client.db.userGetAsync(id, key);
}
}
}
async getGuild(id) {
let db = this
return new function() {
this.id = id
this.db = db
this.get = async function(key) {
let result = await this.db.guildGetAsync(this.id + '-' + key)
if(result === null) { if(result === null) {
return this.db.client.config.defaultGuildData[key] result = this.client.config.defaultUserData[key]
} else {
if(String(result).startsWith('[') || String(result).startsWith('{')) return JSON.parse(result)
return result if (!result) {
throw new Error('The key provided is invalid. Please check for typing errors.')
} }
} }
this.set = async function(key, value) { return result;
if(typeof(value) === 'object') value = JSON.stringify(value)
return await this.db.guildSetAsync(this.id + '-' + key, value)
}
this.delete = async function() {
return await this.db.deleteGuild(this.id)
}
}
} }
// Deletes specified guild entry // Deletes specified guild entry
async deleteGuild(id) { async guildDelete (id) {
for await (const key of this.guildGenerators.keysMatching(id + '-*')) { this.guild.del(id)
this.guild.del(key) var { keysMatching } = await generators.using(this.member)
} // eslint-disable-next-line no-unused-vars
} for await (const key of keysMatching(id + '-*')) {
// Deletes specified user and their member entries in guilds
async deleteUser(id) {
for await (const key of this.userGenerators.keysMatching(id + '-*')) {
this.user.del(key)
}
for await (const key of this.memberGenerators.keysMatching('*-' + id + '-*')) {
this.member.del(key) this.member.del(key)
} }
} }
// Deletes specified user. If deleteAll, also delete their member entries in guilds
async userDelete (id, deleteAll) {
this.user.del(id)
if (deleteAll) {
var { keysMatching } = await generators.using(this.member)
// eslint-disable-next-line no-unused-vars
for await (const key of keysMatching('*-' + id)) {
this.member.del(key)
}
}
}
// Deletes member of user in specified guild // Deletes member of user in specified guild
async deleteMember(guildId, id) { async memberDelete (guildId, id) {
for await (const key of this.memberGenerators.keysMatching(guildId + '-' + id + '-*')) { this.member.del(guildId + '-' + id)
this.member.del(key)
}
} }
} }
module.exports = RedisDatabase module.exports = Redis;