mirror of
https://github.com/SpiceBot/SpiceBot.git
synced 2026-11-10 21:50:59 -05:00
First database cache test
This commit is contained in:
parent
00cbc16188
commit
66beaa969c
251
sopel_modules/SpiceBot/Database.py
Normal file
251
sopel_modules/SpiceBot/Database.py
Normal file
@ -0,0 +1,251 @@
|
||||
# coding=utf8
|
||||
from __future__ import unicode_literals, absolute_import, division, print_function
|
||||
"""
|
||||
This is the SpiceBot Database
|
||||
"""
|
||||
|
||||
from sopel.tools import Identifier
|
||||
|
||||
import threading
|
||||
|
||||
|
||||
class BotDatabase():
|
||||
"""A thread safe database cache"""
|
||||
|
||||
def __init__(self):
|
||||
self.lock = threading.Lock()
|
||||
self.SpiceBot_Database = {
|
||||
"nicks": {},
|
||||
"channels": {},
|
||||
}
|
||||
|
||||
"""Nick"""
|
||||
|
||||
def get_nick_value(self, bot, nick, key, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
nick = Identifier(nick)
|
||||
nick_id = bot.db.get_nick_id(nick, create=True)
|
||||
|
||||
if nick_id not in self.SpiceBot_Database["nicks"].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
|
||||
|
||||
self.lock.release()
|
||||
|
||||
if key not in self.SpiceBot_Database["nicks"][nick_id][sorting_key].keys():
|
||||
return None
|
||||
else:
|
||||
return self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]
|
||||
|
||||
def set_nick_value(self, bot, nick, key, value, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
nick = Identifier(nick)
|
||||
nick_id = bot.db.get_nick_id(nick, create=True)
|
||||
|
||||
if nick_id not in self.SpiceBot_Database["nicks"].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id] = {}
|
||||
self.lock.release()
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
|
||||
self.lock.release()
|
||||
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = value
|
||||
|
||||
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
def delete_nick_value(self, bot, nick, key, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
nick = Identifier(nick)
|
||||
nick_id = bot.db.get_nick_id(nick, create=True)
|
||||
|
||||
if nick_id not in self.SpiceBot_Database["nicks"].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
|
||||
|
||||
del self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]
|
||||
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
def adjust_nick_value(self, bot, nick, key, value, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
nick = Identifier(nick)
|
||||
nick_id = bot.db.get_nick_id(nick, create=True)
|
||||
|
||||
if nick_id not in self.SpiceBot_Database["nicks"].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
|
||||
|
||||
if key not in self.SpiceBot_Database["nicks"][nick_id][sorting_key].keys():
|
||||
oldvalue = []
|
||||
else:
|
||||
oldvalue = self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]
|
||||
|
||||
if not oldvalue:
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = value
|
||||
else:
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = oldvalue + value
|
||||
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
def adjust_nick_list(self, bot, nick, key, entries, adjustmentdirection, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
if not isinstance(entries, list):
|
||||
entries = [entries]
|
||||
|
||||
nick = Identifier(nick)
|
||||
nick_id = bot.db.get_nick_id(nick, create=True)
|
||||
|
||||
if nick_id not in self.SpiceBot_Database["nicks"].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
|
||||
|
||||
if key not in self.SpiceBot_Database["nicks"][nick_id][sorting_key].keys():
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = []
|
||||
|
||||
if adjustmentdirection == 'add':
|
||||
for entry in entries:
|
||||
if entry not in self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]:
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key].append(entry)
|
||||
elif adjustmentdirection == 'del':
|
||||
for entry in entries:
|
||||
while entry in self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]:
|
||||
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key].remove(entry)
|
||||
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
"""Channels"""
|
||||
|
||||
def get_channel_value(self, bot, channel, key, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
channel = Identifier(channel)
|
||||
|
||||
if channel not in self.SpiceBot_Database["channels"].keys():
|
||||
self.SpiceBot_Database["channels"][channel] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
|
||||
|
||||
self.lock.release()
|
||||
|
||||
if key not in self.SpiceBot_Database["channels"][channel][sorting_key].keys():
|
||||
return None
|
||||
else:
|
||||
return self.SpiceBot_Database["channels"][channel][sorting_key][key]
|
||||
|
||||
def set_channel_value(self, bot, channel, key, value, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
channel = Identifier(channel)
|
||||
|
||||
if channel not in self.SpiceBot_Database["channels"].keys():
|
||||
self.SpiceBot_Database["channels"][channel] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
|
||||
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key][key] = value
|
||||
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
def delete_channel_value(self, bot, channel, key, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
channel = Identifier(channel)
|
||||
|
||||
if channel not in self.SpiceBot_Database["channels"].keys():
|
||||
self.SpiceBot_Database["channels"][channel] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
|
||||
|
||||
del self.SpiceBot_Database["channels"][channel][sorting_key][key]
|
||||
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
def adjust_channel_value(self, bot, channel, key, value, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
channel = Identifier(channel)
|
||||
|
||||
if channel not in self.SpiceBot_Database["channels"].keys():
|
||||
self.SpiceBot_Database["channels"][channel] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
|
||||
|
||||
if key not in self.SpiceBot_Database["channels"][channel][sorting_key].keys():
|
||||
oldvalue = None
|
||||
else:
|
||||
oldvalue = self.SpiceBot_Database["channels"][channel][sorting_key][key]
|
||||
|
||||
if not oldvalue:
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key][key] = value
|
||||
else:
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key][key] = oldvalue + value
|
||||
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
def adjust_channel_list(self, bot, channel, key, entries, adjustmentdirection, sorting_key='unsorted'):
|
||||
|
||||
self.lock.acquire()
|
||||
|
||||
if not isinstance(entries, list):
|
||||
entries = [entries]
|
||||
|
||||
channel = Identifier(channel)
|
||||
|
||||
if channel not in self.SpiceBot_Database["channels"].keys():
|
||||
self.SpiceBot_Database["channels"][channel] = {}
|
||||
|
||||
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
|
||||
|
||||
if key not in self.SpiceBot_Database["channels"][channel][sorting_key].keys():
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key][key] = []
|
||||
|
||||
if adjustmentdirection == 'add':
|
||||
for entry in entries:
|
||||
if entry not in self.SpiceBot_Database["channels"][channel][sorting_key][key]:
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key][key].append(entry)
|
||||
elif adjustmentdirection == 'del':
|
||||
for entry in entries:
|
||||
while entry in self.SpiceBot_Database["channels"][channel][sorting_key][key]:
|
||||
self.SpiceBot_Database["channels"][channel][sorting_key][key].remove(entry)
|
||||
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
|
||||
|
||||
self.lock.release()
|
||||
|
||||
|
||||
botdb = BotDatabase()
|
||||
@ -11,6 +11,7 @@ from .Logs import *
|
||||
from .Commands import *
|
||||
from .Events import *
|
||||
from .Channels import *
|
||||
from .Database import *
|
||||
|
||||
__author__ = 'Sam Zick'
|
||||
__email__ = 'sam@deathbybandaid.net'
|
||||
|
||||
@ -1,19 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# coding=utf-8
|
||||
from __future__ import unicode_literals, absolute_import, print_function, division
|
||||
|
||||
# sopel imports
|
||||
import sopel.module
|
||||
|
||||
from sopel_modules.SpiceBot.Logs import botlogs
|
||||
|
||||
|
||||
def setup(bot):
|
||||
botlogs.log('SpiceBot_DatabaseCache', "Setting up Database Cache")
|
||||
if 'SpiceBot_DatabaseCache' not in bot.memory:
|
||||
bot.memory['SpiceBot_DatabaseCache'] = dict()
|
||||
|
||||
|
||||
def shutdown(bot):
|
||||
if "SpiceBot_DatabaseCache" in bot.memory:
|
||||
del bot.memory["SpiceBot_DatabaseCache"]
|
||||
@ -1,6 +0,0 @@
|
||||
# coding=utf-8
|
||||
"""Useful miscellaneous tools and shortcuts for SpiceBot Sopel modules
|
||||
"""
|
||||
from __future__ import unicode_literals, absolute_import, print_function, division
|
||||
|
||||
from .DatabaseCache import *
|
||||
@ -1,57 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# coding=utf-8
|
||||
from __future__ import unicode_literals, absolute_import, print_function, division
|
||||
|
||||
# sopel imports
|
||||
import sopel.module
|
||||
|
||||
|
||||
"""Database Direct"""
|
||||
|
||||
|
||||
# Get a value
|
||||
def db_get_nick_value(bot, nick, key):
|
||||
database_value = bot.db.get_nick_value(nick, key) or None
|
||||
return database_value
|
||||
|
||||
|
||||
# set a value
|
||||
def db_set_nick_value(bot, nick, key, value):
|
||||
bot.db.set_nick_value(nick, key, value)
|
||||
|
||||
|
||||
# DELETE a value
|
||||
def db_reset_value(bot, nick, key):
|
||||
bot.db.reset_nick_value(nick, key)
|
||||
|
||||
|
||||
# add or subtract from current value
|
||||
def db_adjust_value(bot, nick, key, value):
|
||||
bot.db.adjust_nick_value(nick, key, value)
|
||||
|
||||
|
||||
# list stored in database, add or remove elements
|
||||
def db_adjust_list(bot, nick, entries, key, adjustmentdirection):
|
||||
if not isinstance(entries, list):
|
||||
entries = [entries]
|
||||
adjustlist = db_get_nick_value(bot, nick, key) or []
|
||||
adjustlistnew = []
|
||||
for x in adjustlist:
|
||||
adjustlistnew.append(x)
|
||||
db_reset_value(bot, nick, key)
|
||||
adjustlist = []
|
||||
if adjustmentdirection == 'add':
|
||||
for y in entries:
|
||||
if y not in adjustlistnew:
|
||||
adjustlistnew.append(y)
|
||||
elif adjustmentdirection == 'del':
|
||||
for y in entries:
|
||||
if y in adjustlistnew:
|
||||
adjustlistnew.remove(y)
|
||||
for x in adjustlistnew:
|
||||
if x not in adjustlist:
|
||||
adjustlist.append(x)
|
||||
if not len(adjustlist):
|
||||
db_reset_value(bot, nick, key)
|
||||
else:
|
||||
db_set_nick_value(bot, nick, key, adjustlist)
|
||||
@ -1,6 +0,0 @@
|
||||
# coding=utf-8
|
||||
"""Useful miscellaneous tools and shortcuts for SpiceBot Sopel modules
|
||||
"""
|
||||
from __future__ import unicode_literals, absolute_import, print_function, division
|
||||
|
||||
from .DatabaseTools import *
|
||||
Loading…
Reference in New Issue
Block a user