Files
profiles-plugin/profiles/twitch/component.py
T

93 lines
2.7 KiB
Python

from typing import Optional
import asyncio
import twitchio
from twitchio.ext import commands as cmds
from meta import Bot
from meta.logger import log_wrap
from utils.lib import utc_now
from . import logger
from ..data import (
ProfilesData,
UserProfile,
TwitchProfileLink,
Community,
TwitchCommunityLink,
)
from ..profiles import ProfilesRegistry
class ProfilesComponent(cmds.Component):
def __init__(self, bot: Bot):
self.bot = bot
self.data = bot.dbconn.load_registry(ProfilesData())
self.profiles = ProfilesRegistry(self.data)
# ----- API -----
async def component_load(self):
await self.data.init()
await self.bot.version_check(*self.data.VERSION)
await self.profiles.init()
async def component_teardown(self):
pass
# ------ Commands -----
@log_wrap(isolate=True, action="Fetch Profile")
async def fetch_profile(
self,
user: twitchio.PartialUser,
touch: bool = False,
) -> UserProfile:
"""
Fetch or create the profile for the given user.
"""
userid = str(user.id)
# TODO: Transaction
profile = await self.profiles.get_profile_twitch(userid)
if profile is None:
args = {}
try:
user = await user.user()
args["nickname"] = user.display_name
args["avatar"] = user.profile_image.url
except twitchio.HTTPException:
pass
except IndexError:
pass
profile = await UserProfile.create(**args)
await TwitchProfileLink.create(profileid=profile.profileid, userid=userid)
elif touch:
args = {}
# TODO: Should be factored into nickname_hint or similar
if user.display_name is not None and user.display_name != profile.nickname:
args["nickname"] = user.display_name
await profile.update(last_seen=utc_now(), **args)
return profile
@log_wrap(isolate=True, action="Fetch Community")
async def fetch_community(
self,
channel: twitchio.PartialUser,
touch: bool = False,
) -> Community:
"""
Fetch or create the community for this channel.
"""
chanid = channel.id
# TODO: Transaction
comm = await self.profiles.get_community_twitch(chanid)
if comm is None:
comm = await Community.create()
await TwitchCommunityLink.create(
channelid=chanid, communityid=comm.communityid
)
elif touch:
await comm.update(last_seen=utc_now())
return comm