mirror of
https://github.com/SpiceBot/SpiceBot.git
synced 2026-11-11 14:10:58 -05:00
381 lines
13 KiB
Python
381 lines
13 KiB
Python
# coding=utf8
|
|
from __future__ import unicode_literals, absolute_import, division, print_function
|
|
"""
|
|
This is the SpiceBot Database
|
|
"""
|
|
|
|
# sopel imports
|
|
from sopel.tools import Identifier
|
|
from sopel.db import SopelDB
|
|
|
|
import threading
|
|
from .Config import config as botconfig
|
|
|
|
|
|
class BotDatabase():
|
|
"""A thread safe database cache"""
|
|
|
|
def __init__(self):
|
|
self.lock = threading.Lock()
|
|
self.dict = {
|
|
"nicks": {},
|
|
"channels": {},
|
|
}
|
|
self.db = SopelDB(botconfig.config)
|
|
|
|
"""Nick"""
|
|
|
|
def get_nick_value(self, nick, key, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
nick = Identifier(nick)
|
|
nick_id = self.db.get_nick_id(nick, create=True)
|
|
|
|
if nick_id not in self.dict["nicks"].keys():
|
|
self.dict["nicks"][nick_id] = {}
|
|
|
|
if sorting_key not in self.dict["nicks"][nick_id].keys():
|
|
self.dict["nicks"][nick_id][sorting_key] = self.db.get_nick_value(nick, sorting_key) or dict()
|
|
|
|
self.lock.release()
|
|
|
|
if key not in self.dict["nicks"][nick_id][sorting_key].keys():
|
|
return None
|
|
else:
|
|
return self.dict["nicks"][nick_id][sorting_key][key]
|
|
|
|
def set_nick_value(self, nick, key, value, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
nick = Identifier(nick)
|
|
nick_id = self.db.get_nick_id(nick, create=True)
|
|
|
|
if nick_id not in self.dict["nicks"].keys():
|
|
self.dict["nicks"][nick_id] = {}
|
|
|
|
if sorting_key not in self.dict["nicks"][nick_id].keys():
|
|
self.dict["nicks"][nick_id][sorting_key] = self.db.get_nick_value(nick, sorting_key) or dict()
|
|
|
|
self.dict["nicks"][nick_id][sorting_key][key] = value
|
|
|
|
self.db.set_nick_value(nick, sorting_key, self.dict["nicks"][nick_id][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def delete_nick_value(self, nick, key, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
nick = Identifier(nick)
|
|
nick_id = self.db.get_nick_id(nick, create=True)
|
|
|
|
if nick_id not in self.dict["nicks"].keys():
|
|
self.dict["nicks"][nick_id] = {}
|
|
|
|
if sorting_key not in self.dict["nicks"][nick_id].keys():
|
|
self.dict["nicks"][nick_id][sorting_key] = self.db.get_nick_value(nick, sorting_key) or dict()
|
|
|
|
del self.dict["nicks"][nick_id][sorting_key][key]
|
|
self.db.set_nick_value(nick, sorting_key, self.dict["nicks"][nick_id][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def adjust_nick_value(self, nick, key, value, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
nick = Identifier(nick)
|
|
nick_id = self.db.get_nick_id(nick, create=True)
|
|
|
|
if nick_id not in self.dict["nicks"].keys():
|
|
self.dict["nicks"][nick_id] = {}
|
|
|
|
if sorting_key not in self.dict["nicks"][nick_id].keys():
|
|
self.dict["nicks"][nick_id][sorting_key] = self.db.get_nick_value(nick, sorting_key) or dict()
|
|
|
|
if key not in self.dict["nicks"][nick_id][sorting_key].keys():
|
|
oldvalue = []
|
|
else:
|
|
oldvalue = self.dict["nicks"][nick_id][sorting_key][key]
|
|
|
|
if not oldvalue:
|
|
self.dict["nicks"][nick_id][sorting_key][key] = value
|
|
else:
|
|
self.dict["nicks"][nick_id][sorting_key][key] = oldvalue + value
|
|
self.db.set_nick_value(nick, sorting_key, self.dict["nicks"][nick_id][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def adjust_nick_list(self, nick, key, entries, adjustmentdirection, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
if not isinstance(entries, list):
|
|
entries = [entries]
|
|
|
|
nick = Identifier(nick)
|
|
nick_id = self.db.get_nick_id(nick, create=True)
|
|
|
|
if nick_id not in self.dict["nicks"].keys():
|
|
self.dict["nicks"][nick_id] = {}
|
|
|
|
if sorting_key not in self.dict["nicks"][nick_id].keys():
|
|
self.dict["nicks"][nick_id][sorting_key] = self.db.get_nick_value(nick, sorting_key) or dict()
|
|
|
|
if key not in self.dict["nicks"][nick_id][sorting_key].keys():
|
|
self.dict["nicks"][nick_id][sorting_key][key] = []
|
|
|
|
if adjustmentdirection == 'add':
|
|
for entry in entries:
|
|
if entry not in self.dict["nicks"][nick_id][sorting_key][key]:
|
|
self.dict["nicks"][nick_id][sorting_key][key].append(entry)
|
|
elif adjustmentdirection == 'del':
|
|
for entry in entries:
|
|
while entry in self.dict["nicks"][nick_id][sorting_key][key]:
|
|
self.dict["nicks"][nick_id][sorting_key][key].remove(entry)
|
|
self.db.set_nick_value(nick, sorting_key, self.dict["nicks"][nick_id][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
"""Bot"""
|
|
|
|
def get_bot_value(self, key, sorting_key='unsorted'):
|
|
return self.get_nick_value(botconfig.nick, key, sorting_key)
|
|
|
|
def set_bot_value(self, key, value, sorting_key='unsorted'):
|
|
return self.set_nick_value(botconfig.nick, key, value, sorting_key)
|
|
|
|
def delete_bot_value(self, key, sorting_key='unsorted'):
|
|
return self.delete_nick_value(botconfig.nick, key, sorting_key)
|
|
|
|
def adjust_bot_value(self, key, value, sorting_key='unsorted'):
|
|
return self.adjust_nick_value(botconfig.nick, key, value, sorting_key)
|
|
|
|
def adjust_bot_list(self, key, entries, adjustmentdirection, sorting_key):
|
|
return self.adjust_nick_list(botconfig.nick, key, entries, adjustmentdirection, sorting_key)
|
|
|
|
"""Channels"""
|
|
|
|
def get_channel_value(self, channel, key, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
channel = Identifier(channel).lower().lower()
|
|
|
|
if channel not in self.dict["channels"].keys():
|
|
self.dict["channels"][channel] = {}
|
|
|
|
if sorting_key not in self.dict["channels"][channel].keys():
|
|
self.dict["channels"][channel][sorting_key] = self.db.get_channel_value(channel, sorting_key) or dict()
|
|
|
|
self.lock.release()
|
|
|
|
if key not in self.dict["channels"][channel][sorting_key].keys():
|
|
return None
|
|
else:
|
|
return self.dict["channels"][channel][sorting_key][key]
|
|
|
|
def set_channel_value(self, channel, key, value, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
channel = Identifier(channel).lower()
|
|
|
|
if channel not in self.dict["channels"].keys():
|
|
self.dict["channels"][channel] = {}
|
|
|
|
if sorting_key not in self.dict["channels"][channel].keys():
|
|
self.dict["channels"][channel][sorting_key] = self.db.get_channel_value(channel, sorting_key) or dict()
|
|
|
|
self.dict["channels"][channel][sorting_key][key] = value
|
|
self.db.set_channel_value(channel, sorting_key, self.dict["channels"][channel][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def delete_channel_value(self, channel, key, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
channel = Identifier(channel).lower()
|
|
|
|
if channel not in self.dict["channels"].keys():
|
|
self.dict["channels"][channel] = {}
|
|
|
|
if sorting_key not in self.dict["channels"][channel].keys():
|
|
self.dict["channels"][channel][sorting_key] = self.db.get_channel_value(channel, sorting_key) or dict()
|
|
|
|
del self.dict["channels"][channel][sorting_key][key]
|
|
self.db.set_channel_value(channel, sorting_key, self.dict["channels"][channel][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def adjust_channel_value(self, channel, key, value, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
channel = Identifier(channel).lower()
|
|
|
|
if channel not in self.dict["channels"].keys():
|
|
self.dict["channels"][channel] = {}
|
|
|
|
if sorting_key not in self.dict["channels"][channel].keys():
|
|
self.dict["channels"][channel][sorting_key] = self.db.get_channel_value(channel, sorting_key) or dict()
|
|
|
|
if key not in self.dict["channels"][channel][sorting_key].keys():
|
|
oldvalue = None
|
|
else:
|
|
oldvalue = self.dict["channels"][channel][sorting_key][key]
|
|
|
|
if not oldvalue:
|
|
self.dict["channels"][channel][sorting_key][key] = value
|
|
else:
|
|
self.dict["channels"][channel][sorting_key][key] = oldvalue + value
|
|
self.db.set_channel_value(channel, sorting_key, self.dict["channels"][channel][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def adjust_channel_list(self, channel, key, entries, adjustmentdirection, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
if not isinstance(entries, list):
|
|
entries = [entries]
|
|
|
|
channel = Identifier(channel).lower()
|
|
|
|
if channel not in self.dict["channels"].keys():
|
|
self.dict["channels"][channel] = {}
|
|
|
|
if sorting_key not in self.dict["channels"][channel].keys():
|
|
self.dict["channels"][channel][sorting_key] = self.db.get_channel_value(channel, sorting_key) or dict()
|
|
|
|
if key not in self.dict["channels"][channel][sorting_key].keys():
|
|
self.dict["channels"][channel][sorting_key][key] = []
|
|
|
|
if adjustmentdirection == 'add':
|
|
for entry in entries:
|
|
if entry not in self.dict["channels"][channel][sorting_key][key]:
|
|
self.dict["channels"][channel][sorting_key][key].append(entry)
|
|
elif adjustmentdirection == 'del':
|
|
for entry in entries:
|
|
while entry in self.dict["channels"][channel][sorting_key][key]:
|
|
self.dict["channels"][channel][sorting_key][key].remove(entry)
|
|
self.db.set_channel_value(channel, sorting_key, self.dict["channels"][channel][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
"""Plugins"""
|
|
|
|
def get_plugin_value(self, plugin, key, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
plugin = plugin.lower()
|
|
|
|
if plugin not in self.dict["plugins"].keys():
|
|
self.dict["plugins"][plugin] = {}
|
|
|
|
if sorting_key not in self.dict["plugins"][plugin].keys():
|
|
self.dict["plugins"][plugin][sorting_key] = self.db.get_plugin_value(plugin, sorting_key) or dict()
|
|
|
|
self.lock.release()
|
|
|
|
if key not in self.dict["plugins"][plugin][sorting_key].keys():
|
|
return None
|
|
else:
|
|
return self.dict["plugins"][plugin][sorting_key][key]
|
|
|
|
def set_plugin_value(self, plugin, key, value, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
plugin = plugin.lower()
|
|
|
|
if plugin not in self.dict["plugins"].keys():
|
|
self.dict["plugins"][plugin] = {}
|
|
|
|
if sorting_key not in self.dict["plugins"][plugin].keys():
|
|
self.dict["plugins"][plugin][sorting_key] = self.db.get_plugin_value(plugin, sorting_key) or dict()
|
|
|
|
self.dict["plugins"][plugin][sorting_key][key] = value
|
|
self.db.set_plugin_value(plugin, sorting_key, self.dict["plugins"][plugin][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def delete_plugin_value(self, plugin, key, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
plugin = plugin.lower()
|
|
|
|
if plugin not in self.dict["plugins"].keys():
|
|
self.dict["plugins"][plugin] = {}
|
|
|
|
if sorting_key not in self.dict["plugins"][plugin].keys():
|
|
self.dict["plugins"][plugin][sorting_key] = self.db.get_plugin_value(plugin, sorting_key) or dict()
|
|
|
|
del self.dict["plugins"][plugin][sorting_key][key]
|
|
self.db.set_plugin_value(plugin, sorting_key, self.dict["plugins"][plugin][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def adjust_plugin_value(self, plugin, key, value, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
plugin = plugin.lower()
|
|
|
|
if plugin not in self.dict["plugins"].keys():
|
|
self.dict["plugins"][plugin] = {}
|
|
|
|
if sorting_key not in self.dict["plugins"][plugin].keys():
|
|
self.dict["plugins"][plugin][sorting_key] = self.db.get_plugin_value(plugin, sorting_key) or dict()
|
|
|
|
if key not in self.dict["plugins"][plugin][sorting_key].keys():
|
|
oldvalue = None
|
|
else:
|
|
oldvalue = self.dict["plugins"][plugin][sorting_key][key]
|
|
|
|
if not oldvalue:
|
|
self.dict["plugins"][plugin][sorting_key][key] = value
|
|
else:
|
|
self.dict["plugins"][plugin][sorting_key][key] = oldvalue + value
|
|
self.db.set_plugin_value(plugin, sorting_key, self.dict["plugins"][plugin][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
def adjust_plugin_list(self, plugin, key, entries, adjustmentdirection, sorting_key='unsorted'):
|
|
|
|
self.lock.acquire()
|
|
|
|
if not isinstance(entries, list):
|
|
entries = [entries]
|
|
|
|
plugin = plugin.lower()
|
|
|
|
if plugin not in self.dict["plugins"].keys():
|
|
self.dict["plugins"][plugin] = {}
|
|
|
|
if sorting_key not in self.dict["plugins"][plugin].keys():
|
|
self.dict["plugins"][plugin][sorting_key] = self.db.get_plugin_value(plugin, sorting_key) or dict()
|
|
|
|
if key not in self.dict["plugins"][plugin][sorting_key].keys():
|
|
self.dict["plugins"][plugin][sorting_key][key] = []
|
|
|
|
if adjustmentdirection == 'add':
|
|
for entry in entries:
|
|
if entry not in self.dict["plugins"][plugin][sorting_key][key]:
|
|
self.dict["plugins"][plugin][sorting_key][key].append(entry)
|
|
elif adjustmentdirection == 'del':
|
|
for entry in entries:
|
|
while entry in self.dict["plugins"][plugin][sorting_key][key]:
|
|
self.dict["plugins"][plugin][sorting_key][key].remove(entry)
|
|
self.db.set_plugin_value(plugin, sorting_key, self.dict["plugins"][plugin][sorting_key])
|
|
|
|
self.lock.release()
|
|
|
|
|
|
db = BotDatabase()
|