From 66beaa969c6d2edda66ef6a988c4277930abea3a Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Wed, 22 May 2019 10:32:36 -0400 Subject: [PATCH] First database cache test --- sopel_modules/SpiceBot/Database.py | 251 ++++++++++++++++++ sopel_modules/SpiceBot/__init__.py | 1 + .../SpiceBot_Database_Cache/DatabaseCache.py | 19 -- .../SpiceBot_Database_Cache/__init__.py | 6 - .../SpiceBot_Database_Tools/DatabaseTools.py | 57 ---- .../SpiceBot_Database_Tools/__init__.py | 6 - 6 files changed, 252 insertions(+), 88 deletions(-) create mode 100644 sopel_modules/SpiceBot/Database.py delete mode 100644 sopel_modules/SpiceBot_Database_Cache/DatabaseCache.py delete mode 100644 sopel_modules/SpiceBot_Database_Cache/__init__.py delete mode 100644 sopel_modules/SpiceBot_Database_Tools/DatabaseTools.py delete mode 100644 sopel_modules/SpiceBot_Database_Tools/__init__.py diff --git a/sopel_modules/SpiceBot/Database.py b/sopel_modules/SpiceBot/Database.py new file mode 100644 index 0000000..4cd8390 --- /dev/null +++ b/sopel_modules/SpiceBot/Database.py @@ -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() diff --git a/sopel_modules/SpiceBot/__init__.py b/sopel_modules/SpiceBot/__init__.py index 43549f3..2606e87 100644 --- a/sopel_modules/SpiceBot/__init__.py +++ b/sopel_modules/SpiceBot/__init__.py @@ -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' diff --git a/sopel_modules/SpiceBot_Database_Cache/DatabaseCache.py b/sopel_modules/SpiceBot_Database_Cache/DatabaseCache.py deleted file mode 100644 index f31ea22..0000000 --- a/sopel_modules/SpiceBot_Database_Cache/DatabaseCache.py +++ /dev/null @@ -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"] diff --git a/sopel_modules/SpiceBot_Database_Cache/__init__.py b/sopel_modules/SpiceBot_Database_Cache/__init__.py deleted file mode 100644 index 212ae54..0000000 --- a/sopel_modules/SpiceBot_Database_Cache/__init__.py +++ /dev/null @@ -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 * diff --git a/sopel_modules/SpiceBot_Database_Tools/DatabaseTools.py b/sopel_modules/SpiceBot_Database_Tools/DatabaseTools.py deleted file mode 100644 index e074941..0000000 --- a/sopel_modules/SpiceBot_Database_Tools/DatabaseTools.py +++ /dev/null @@ -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) diff --git a/sopel_modules/SpiceBot_Database_Tools/__init__.py b/sopel_modules/SpiceBot_Database_Tools/__init__.py deleted file mode 100644 index 6cd3826..0000000 --- a/sopel_modules/SpiceBot_Database_Tools/__init__.py +++ /dev/null @@ -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 *