mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-12-07 09:52:30 -05:00
[Core] Replaced JsonDB with Config (#770)
This commit is contained in:
0
core/drivers/__init__.py
Normal file
0
core/drivers/__init__.py
Normal file
45
core/drivers/red_base.py
Normal file
45
core/drivers/red_base.py
Normal file
@@ -0,0 +1,45 @@
|
||||
class BaseDriver:
|
||||
def get_global(self, cog_name, ident, collection_id, key, *, default=None):
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_guild(self, cog_name, ident, guild_id, key, *, default=None):
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_channel(self, cog_name, ident, channel_id, key, *, default=None):
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_role(self, cog_name, ident, role_id, key, *, default=None):
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_member(self, cog_name, ident, user_id, guild_id, key, *,
|
||||
default=None):
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_user(self, cog_name, ident, user_id, key, *, default=None):
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_misc(self, cog_name, ident, *, default=None):
|
||||
raise NotImplementedError()
|
||||
|
||||
async def set_global(self, cog_name, ident, key, value, clear=False):
|
||||
raise NotImplementedError()
|
||||
|
||||
async def set_guild(self, cog_name, ident, guild_id, key, value, clear=False):
|
||||
raise NotImplementedError()
|
||||
|
||||
async def set_channel(self, cog_name, ident, channel_id, key, value,
|
||||
clear=False):
|
||||
raise NotImplementedError()
|
||||
|
||||
async def set_role(self, cog_name, ident, role_id, key, value, clear=False):
|
||||
raise NotImplementedError()
|
||||
|
||||
async def set_member(self, cog_name, ident, user_id, guild_id, key, value,
|
||||
clear=False):
|
||||
raise NotImplementedError()
|
||||
|
||||
async def set_user(self, cog_name, ident, user_id, key, value, clear=False):
|
||||
raise NotImplementedError()
|
||||
|
||||
async def set_misc(self, cog_name, ident, value, clear=False):
|
||||
raise NotImplementedError()
|
||||
135
core/drivers/red_json.py
Normal file
135
core/drivers/red_json.py
Normal file
@@ -0,0 +1,135 @@
|
||||
from core.json_io import JsonIO
|
||||
import os
|
||||
from .red_base import BaseDriver
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class JSON(BaseDriver):
|
||||
def __init__(self, cog_name, *args, data_path_override: Path=None,
|
||||
file_name_override: str="settings.json", **kwargs):
|
||||
self.cog_name = cog_name
|
||||
self.file_name = file_name_override
|
||||
if data_path_override:
|
||||
self.data_path = data_path_override
|
||||
else:
|
||||
self.data_path = Path.cwd() / 'cogs' / '.data' / self.cog_name
|
||||
|
||||
self.data_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
self.data_path = self.data_path / self.file_name
|
||||
|
||||
self.jsonIO = JsonIO(self.data_path)
|
||||
|
||||
try:
|
||||
self.data = self.jsonIO._load_json()
|
||||
except FileNotFoundError:
|
||||
self.data = {}
|
||||
|
||||
def maybe_add_ident(self, ident: str):
|
||||
if ident in self.data:
|
||||
return
|
||||
|
||||
self.data[ident] = {}
|
||||
for k in ("GLOBAL", "GUILD", "CHANNEL", "ROLE", "MEMBER", "USER"):
|
||||
if k not in self.data[ident]:
|
||||
self.data[ident][k] = {}
|
||||
|
||||
self.jsonIO._save_json(self.data)
|
||||
|
||||
def get_global(self, cog_name, ident, _, key, *, default=None):
|
||||
return self.data[ident]["GLOBAL"].get(key, default)
|
||||
|
||||
def get_guild(self, cog_name, ident, guild_id, key, *, default=None):
|
||||
guilddata = self.data[ident]["GUILD"].get(str(guild_id), {})
|
||||
return guilddata.get(key, default)
|
||||
|
||||
def get_channel(self, cog_name, ident, channel_id, key, *, default=None):
|
||||
channeldata = self.data[ident]["CHANNEL"].get(str(channel_id), {})
|
||||
return channeldata.get(key, default)
|
||||
|
||||
def get_role(self, cog_name, ident, role_id, key, *, default=None):
|
||||
roledata = self.data[ident]["ROLE"].get(str(role_id), {})
|
||||
return roledata.get(key, default)
|
||||
|
||||
def get_member(self, cog_name, ident, user_id, guild_id, key, *,
|
||||
default=None):
|
||||
userdata = self.data[ident]["MEMBER"].get(str(user_id), {})
|
||||
guilddata = userdata.get(str(guild_id), {})
|
||||
return guilddata.get(key, default)
|
||||
|
||||
def get_user(self, cog_name, ident, user_id, key, *, default=None):
|
||||
userdata = self.data[ident]["USER"].get(str(user_id), {})
|
||||
return userdata.get(key, default)
|
||||
|
||||
async def set_global(self, cog_name, ident, key, value, clear=False):
|
||||
if clear:
|
||||
self.data[ident]["GLOBAL"] = {}
|
||||
else:
|
||||
self.data[ident]["GLOBAL"][key] = value
|
||||
await self.jsonIO._threadsafe_save_json(self.data)
|
||||
|
||||
async def set_guild(self, cog_name, ident, guild_id, key, value, clear=False):
|
||||
guild_id = str(guild_id)
|
||||
if clear:
|
||||
self.data[ident]["GUILD"][guild_id] = {}
|
||||
else:
|
||||
try:
|
||||
self.data[ident]["GUILD"][guild_id][key] = value
|
||||
except KeyError:
|
||||
self.data[ident]["GUILD"][guild_id] = {}
|
||||
self.data[ident]["GUILD"][guild_id][key] = value
|
||||
await self.jsonIO._threadsafe_save_json(self.data)
|
||||
|
||||
async def set_channel(self, cog_name, ident, channel_id, key, value, clear=False):
|
||||
channel_id = str(channel_id)
|
||||
if clear:
|
||||
self.data[ident]["CHANNEL"][channel_id] = {}
|
||||
else:
|
||||
try:
|
||||
self.data[ident]["CHANNEL"][channel_id][key] = value
|
||||
except KeyError:
|
||||
self.data[ident]["CHANNEL"][channel_id] = {}
|
||||
self.data[ident]["CHANNEL"][channel_id][key] = value
|
||||
await self.jsonIO._threadsafe_save_json(self.data)
|
||||
|
||||
async def set_role(self, cog_name, ident, role_id, key, value, clear=False):
|
||||
role_id = str(role_id)
|
||||
if clear:
|
||||
self.data[ident]["ROLE"][role_id] = {}
|
||||
else:
|
||||
try:
|
||||
self.data[ident]["ROLE"][role_id][key] = value
|
||||
except KeyError:
|
||||
self.data[ident]["ROLE"][role_id] = {}
|
||||
self.data[ident]["ROLE"][role_id][key] = value
|
||||
await self.jsonIO._threadsafe_save_json(self.data)
|
||||
|
||||
async def set_member(self, cog_name, ident, user_id, guild_id, key, value, clear=False):
|
||||
user_id = str(user_id)
|
||||
guild_id = str(guild_id)
|
||||
if clear:
|
||||
self.data[ident]["MEMBER"][user_id] = {}
|
||||
else:
|
||||
try:
|
||||
self.data[ident]["MEMBER"][user_id][guild_id][key] = value
|
||||
except KeyError:
|
||||
if user_id not in self.data[ident]["MEMBER"]:
|
||||
self.data[ident]["MEMBER"][user_id] = {}
|
||||
if guild_id not in self.data[ident]["MEMBER"][user_id]:
|
||||
self.data[ident]["MEMBER"][user_id][guild_id] = {}
|
||||
|
||||
self.data[ident]["MEMBER"][user_id][guild_id][key] = value
|
||||
await self.jsonIO._threadsafe_save_json(self.data)
|
||||
|
||||
async def set_user(self, cog_name, ident, user_id, key, value, clear=False):
|
||||
user_id = str(user_id)
|
||||
if clear:
|
||||
self.data[ident]["USER"][user_id] = {}
|
||||
else:
|
||||
try:
|
||||
self.data[ident]["USER"][user_id][key] = value
|
||||
except KeyError:
|
||||
self.data[ident]["USER"][user_id] = {}
|
||||
self.data[ident]["USER"][user_id][key] = value
|
||||
await self.jsonIO._threadsafe_save_json(self.data)
|
||||
211
core/drivers/red_mongo.py
Normal file
211
core/drivers/red_mongo.py
Normal file
@@ -0,0 +1,211 @@
|
||||
import pymongo as m
|
||||
from .red_base import BaseDriver
|
||||
|
||||
|
||||
class RedMongoException(Exception):
|
||||
"""Base Red Mongo Exception class"""
|
||||
pass
|
||||
|
||||
|
||||
class MultipleMatches(RedMongoException):
|
||||
"""Raised when multiple documents match a single cog_name and
|
||||
cog_identifier pair."""
|
||||
pass
|
||||
|
||||
|
||||
class MissingCollection(RedMongoException):
|
||||
"""Raised when a collection is missing from the mongo db"""
|
||||
pass
|
||||
|
||||
|
||||
class Mongo(BaseDriver):
|
||||
def __init__(self, host, port=27017, admin_user=None, admin_pass=None,
|
||||
**kwargs):
|
||||
self.conn = m.MongoClient(host=host, port=port, **kwargs)
|
||||
|
||||
self.admin_user = admin_user
|
||||
self.admin_pass = admin_pass
|
||||
|
||||
self._db = self.conn.red
|
||||
if self.admin_user is not None and self.admin_pass is not None:
|
||||
self._db.authenticate(self.admin_user, self.admin_pass)
|
||||
|
||||
self._global = self._db.GLOBAL
|
||||
self._guild = self._db.GUILD
|
||||
self._channel = self._db.CHANNEL
|
||||
self._role = self._db.ROLE
|
||||
self._member = self._db.MEMBER
|
||||
self._user = self._db.USER
|
||||
|
||||
def get_global(self, cog_name, cog_identifier, _, key, *, default=None):
|
||||
doc = self._global.find(
|
||||
{"cog_name": cog_name, "cog_identifier": cog_identifier},
|
||||
projection=[key, ], batch_size=2)
|
||||
if doc.count() == 2:
|
||||
raise MultipleMatches("Too many matching documents at the GLOBAL"
|
||||
" level: ({}, {})".format(cog_name,
|
||||
cog_identifier))
|
||||
elif doc.count() == 1:
|
||||
return doc[0].get(key, default)
|
||||
return default
|
||||
|
||||
def get_guild(self, cog_name, cog_identifier, guild_id, key, *,
|
||||
default=None):
|
||||
doc = self._guild.find(
|
||||
{"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"guild_id": guild_id},
|
||||
projection=[key, ], batch_size=2)
|
||||
if doc.count() == 2:
|
||||
raise MultipleMatches("Too many matching documents at the GUILD"
|
||||
" level: ({}, {}, {})".format(
|
||||
cog_name, cog_identifier, guild_id))
|
||||
elif doc.count() == 1:
|
||||
return doc[0].get(key, default)
|
||||
return default
|
||||
|
||||
def get_channel(self, cog_name, cog_identifier, channel_id, key, *,
|
||||
default=None):
|
||||
doc = self._channel.find(
|
||||
{"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"channel_id": channel_id},
|
||||
projection=[key, ], batch_size=2)
|
||||
if doc.count() == 2:
|
||||
raise MultipleMatches("Too many matching documents at the CHANNEL"
|
||||
" level: ({}, {}, {})".format(
|
||||
cog_name, cog_identifier, channel_id))
|
||||
elif doc.count() == 1:
|
||||
return doc[0].get(key, default)
|
||||
return default
|
||||
|
||||
def get_role(self, cog_name, cog_identifier, role_id, key, *,
|
||||
default=None):
|
||||
doc = self._role.find(
|
||||
{"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"role_id": role_id},
|
||||
projection=[key, ], batch_size=2)
|
||||
if doc.count() == 2:
|
||||
raise MultipleMatches("Too many matching documents at the ROLE"
|
||||
" level: ({}, {}, {})".format(
|
||||
cog_name, cog_identifier, role_id))
|
||||
elif doc.count() == 1:
|
||||
return doc[0].get(key, default)
|
||||
return default
|
||||
|
||||
def get_member(self, cog_name, cog_identifier, user_id, guild_id, key, *,
|
||||
default=None):
|
||||
doc = self._member.find(
|
||||
{"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"user_id": user_id, "guild_id": guild_id},
|
||||
projection=[key, ], batch_size=2)
|
||||
if doc.count() == 2:
|
||||
raise MultipleMatches("Too many matching documents at the MEMBER"
|
||||
" level: ({}, {}, mid {}, sid {})".format(
|
||||
cog_name, cog_identifier, user_id,
|
||||
guild_id))
|
||||
elif doc.count() == 1:
|
||||
return doc[0].get(key, default)
|
||||
return default
|
||||
|
||||
def get_user(self, cog_name, cog_identifier, user_id, key, *,
|
||||
default=None):
|
||||
doc = self._user.find(
|
||||
{"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"user_id": user_id},
|
||||
projection=[key, ], batch_size=2)
|
||||
if doc.count() == 2:
|
||||
raise MultipleMatches("Too many matching documents at the USER"
|
||||
" level: ({}, {}, mid {})".format(
|
||||
cog_name, cog_identifier, user_id))
|
||||
elif doc.count() == 1:
|
||||
return doc[0].get(key, default)
|
||||
else:
|
||||
return default
|
||||
|
||||
def set_global(self, cog_name, cog_identifier, key, value, clear=False):
|
||||
filter = {"cog_name": cog_name, "cog_identifier": cog_identifier}
|
||||
data = {"$set": {key: value}}
|
||||
if self._global.count(filter) > 1:
|
||||
raise MultipleMatches("Too many matching documents at the GLOBAL"
|
||||
" level: ({}, {})".format(cog_name,
|
||||
cog_identifier))
|
||||
else:
|
||||
if clear:
|
||||
self._global.delete_one(filter)
|
||||
else:
|
||||
self._global.update_one(filter, data, upsert=True)
|
||||
|
||||
def set_guild(self, cog_name, cog_identifier, guild_id, key, value,
|
||||
clear=False):
|
||||
filter = {"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"guild_id": guild_id}
|
||||
data = {"$set": {key: value}}
|
||||
if self._guild.count(filter) > 1:
|
||||
raise MultipleMatches("Too many matching documents at the GUILD"
|
||||
" level: ({}, {}, {})".format(
|
||||
cog_name, cog_identifier, guild_id))
|
||||
else:
|
||||
if clear:
|
||||
self._guild.delete_one(filter)
|
||||
else:
|
||||
self._guild.update_one(filter, data, upsert=True)
|
||||
|
||||
def set_channel(self, cog_name, cog_identifier, channel_id, key, value,
|
||||
clear=False):
|
||||
filter = {"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"channel_id": channel_id}
|
||||
data = {"$set": {key: value}}
|
||||
if self._channel.count(filter) > 1:
|
||||
raise MultipleMatches("Too many matching documents at the CHANNEL"
|
||||
" level: ({}, {}, {})".format(
|
||||
cog_name, cog_identifier, channel_id))
|
||||
else:
|
||||
if clear:
|
||||
self._channel.delete_one(filter)
|
||||
else:
|
||||
self._channel.update_one(filter, data, upsert=True)
|
||||
|
||||
def set_role(self, cog_name, cog_identifier, role_id, key, value,
|
||||
clear=False):
|
||||
filter = {"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"role_id": role_id}
|
||||
data = {"$set": {key: value}}
|
||||
if self._role.count(filter) > 1:
|
||||
raise MultipleMatches("Too many matching documents at the ROLE"
|
||||
" level: ({}, {}, {})".format(
|
||||
cog_name, cog_identifier, role_id))
|
||||
else:
|
||||
if clear:
|
||||
self._role.delete_one(filter)
|
||||
else:
|
||||
self._role.update_one(filter, data, upsert=True)
|
||||
|
||||
def set_member(self, cog_name, cog_identifier, user_id, guild_id, key,
|
||||
value, clear=False):
|
||||
filter = {"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"guild_id": guild_id, "user_id": user_id}
|
||||
data = {"$set": {key: value}}
|
||||
if self._member.count(filter) > 1:
|
||||
raise MultipleMatches("Too many matching documents at the MEMBER"
|
||||
" level: ({}, {}, mid {}, sid {})".format(
|
||||
cog_name, cog_identifier, user_id,
|
||||
guild_id))
|
||||
else:
|
||||
if clear:
|
||||
self._member.delete_one(filter)
|
||||
else:
|
||||
self._member.update_one(filter, data, upsert=True)
|
||||
|
||||
def set_user(self, cog_name, cog_identifier, user_id, key, value,
|
||||
clear=False):
|
||||
filter = {"cog_name": cog_name, "cog_identifier": cog_identifier,
|
||||
"user_id": user_id}
|
||||
data = {"$set": {key: value}}
|
||||
if self._user.count(filter) > 1:
|
||||
raise MultipleMatches("Too many matching documents at the USER"
|
||||
" level: ({}, {}, mid {})".format(
|
||||
cog_name, cog_identifier, user_id))
|
||||
else:
|
||||
if clear:
|
||||
self._user.delete_one(filter)
|
||||
else:
|
||||
self._user.update_one(filter, data, upsert=True)
|
||||
Reference in New Issue
Block a user