add basic caching logic for channel settings
This commit is contained in:
parent
7959f1ab88
commit
43a7b7d949
1 changed files with 23 additions and 1 deletions
|
@ -3,6 +3,7 @@ from src import EventManager, IRCBot, IRCBuffer, IRCObject, IRCServer, IRCUser
|
||||||
from src import utils
|
from src import utils
|
||||||
|
|
||||||
RE_MODES = re.compile(r"[-+]\w+")
|
RE_MODES = re.compile(r"[-+]\w+")
|
||||||
|
SETTING_CACHE_EXPIRATION = 60.0*5.0 # 5 minutes
|
||||||
|
|
||||||
class Channel(IRCObject.Object):
|
class Channel(IRCObject.Object):
|
||||||
name = ""
|
name = ""
|
||||||
|
@ -23,6 +24,8 @@ class Channel(IRCObject.Object):
|
||||||
self.created_timestamp = None
|
self.created_timestamp = None
|
||||||
self.buffer = IRCBuffer.Buffer(bot, server)
|
self.buffer = IRCBuffer.Buffer(bot, server)
|
||||||
|
|
||||||
|
self._setting_cache_prefix = "channelsetting%s-" % self.id
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return "IRCChannel.Channel(%s|%s)" % (self.server.name, self.name)
|
return "IRCChannel.Channel(%s|%s)" % (self.server.name, self.name)
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
|
@ -135,12 +138,27 @@ class Channel(IRCObject.Object):
|
||||||
new_modes.append((mode_str, new_arg))
|
new_modes.append((mode_str, new_arg))
|
||||||
return new_modes
|
return new_modes
|
||||||
|
|
||||||
|
def _setting_cache_key(self, key: str) -> str:
|
||||||
|
return self._setting_cache_prefix+key
|
||||||
|
|
||||||
|
def _cache_setting(self, key: str, value: typing.Any) -> str:
|
||||||
|
return self.bot.cache.temporary_cache(key, value,
|
||||||
|
SETTING_CACHE_EXPIRATION)
|
||||||
|
|
||||||
def set_setting(self, setting: str, value: typing.Any):
|
def set_setting(self, setting: str, value: typing.Any):
|
||||||
self.bot.database.channel_settings.set(self.id, setting, value)
|
self.bot.database.channel_settings.set(self.id, setting, value)
|
||||||
|
self._cache_setting(self._setting_cache_key(setting), value)
|
||||||
def get_setting(self, setting: str, default: typing.Any=None
|
def get_setting(self, setting: str, default: typing.Any=None
|
||||||
) -> typing.Any:
|
) -> typing.Any:
|
||||||
return self.bot.database.channel_settings.get(self.id, setting,
|
cache_key = self._setting_cache_key(setting)
|
||||||
|
if self.bot.cache.has_item(cache_key):
|
||||||
|
return self.bot.cache.get(cache_key)
|
||||||
|
|
||||||
|
value = self.bot.database.channel_settings.get(self.id, setting,
|
||||||
default)
|
default)
|
||||||
|
self._cache_setting(cache_key, value)
|
||||||
|
return value
|
||||||
|
|
||||||
def find_settings(self, pattern: str, default: typing.Any=[]
|
def find_settings(self, pattern: str, default: typing.Any=[]
|
||||||
) -> typing.List[typing.Any]:
|
) -> typing.List[typing.Any]:
|
||||||
return self.bot.database.channel_settings.find(self.id, pattern,
|
return self.bot.database.channel_settings.find(self.id, pattern,
|
||||||
|
@ -152,6 +170,10 @@ class Channel(IRCObject.Object):
|
||||||
def del_setting(self, setting: str):
|
def del_setting(self, setting: str):
|
||||||
self.bot.database.channel_settings.delete(self.id, setting)
|
self.bot.database.channel_settings.delete(self.id, setting)
|
||||||
|
|
||||||
|
cache_key = self._setting_cache_key(setting)
|
||||||
|
if self.bot.cache.has_item(cache_key):
|
||||||
|
self.bot.cache.remove(cache_key)
|
||||||
|
|
||||||
def set_user_setting(self, user_id: int, setting: str, value: typing.Any):
|
def set_user_setting(self, user_id: int, setting: str, value: typing.Any):
|
||||||
self.bot.database.user_channel_settings.set(user_id, self.id,
|
self.bot.database.user_channel_settings.set(user_id, self.id,
|
||||||
setting, value)
|
setting, value)
|
||||||
|
|
Loading…
Reference in a new issue