mirror of
https://github.com/SpiceBot/SpiceBot.git
synced 2026-11-13 06:59:53 -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 .Commands import *
|
||||||
from .Events import *
|
from .Events import *
|
||||||
from .Channels import *
|
from .Channels import *
|
||||||
|
from .Database import *
|
||||||
|
|
||||||
__author__ = 'Sam Zick'
|
__author__ = 'Sam Zick'
|
||||||
__email__ = 'sam@deathbybandaid.net'
|
__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