rewrite (core): Refactor lion* classes.
This commit is contained in:
71
src/core/lion_user.py
Normal file
71
src/core/lion_user.py
Normal file
@@ -0,0 +1,71 @@
|
||||
from typing import Optional
|
||||
import discord
|
||||
import pytz
|
||||
|
||||
from meta import LionBot
|
||||
from utils.lib import utc_now, Timezoned
|
||||
from settings.groups import ModelConfig, SettingDotDict
|
||||
|
||||
from .data import CoreData
|
||||
|
||||
|
||||
class UserConfig(ModelConfig):
|
||||
settings = SettingDotDict()
|
||||
_model_settings = set()
|
||||
model = CoreData.User
|
||||
|
||||
@property
|
||||
def timezone(self) -> pytz.timezone:
|
||||
return self.get('timezone')
|
||||
|
||||
|
||||
class LionUser(Timezoned):
|
||||
"""
|
||||
Represents a User in the LionBot paradigm.
|
||||
|
||||
Provides central access to cached data and configuration for a User.
|
||||
|
||||
No guarantee is made that the client has access to this User.
|
||||
"""
|
||||
__slots__ = ('bot', 'data', 'userid', '_user', 'config', '__weakref__')
|
||||
|
||||
Config = UserConfig
|
||||
settings = Config.settings
|
||||
|
||||
def __init__(self, bot: LionBot, data: CoreData.User, user: Optional[discord.User] = None):
|
||||
self.bot = bot
|
||||
self.data = data
|
||||
self.userid = data.userid
|
||||
|
||||
self._user = user
|
||||
|
||||
self.config = self.Config(self.userid, data)
|
||||
|
||||
@property
|
||||
def user(self):
|
||||
if self._user is None:
|
||||
self._user = self.bot.get_user(self.userid)
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def timezone(self) -> pytz.timezone:
|
||||
return self.config.timezone.value
|
||||
|
||||
async def touch_discord_model(self, user: discord.User, seen=True):
|
||||
"""
|
||||
Updated stored Discord model attributes for this user.
|
||||
"""
|
||||
to_update = {}
|
||||
|
||||
avatar_key = user.avatar.key if user.avatar else None
|
||||
if self.data.avatar_hash != avatar_key:
|
||||
to_update['avatar_hash'] = avatar_key
|
||||
|
||||
if self.data.name != user.name:
|
||||
to_update['name'] = user.name
|
||||
|
||||
if seen:
|
||||
to_update['last_seen'] = utc_now()
|
||||
|
||||
if to_update:
|
||||
await self.data.update(**to_update)
|
||||
Reference in New Issue
Block a user