feat: Start merged profiles and communities.
This commit is contained in:
@@ -1485,6 +1485,73 @@ CREATE UNIQUE INDEX channel_tags_channelid_name ON channel_tags (channelid, name
|
|||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
|
|
||||||
|
-- User and Community Profiles {{{
|
||||||
|
|
||||||
|
CREATE TABLE user_profiles(
|
||||||
|
profileid SERIAL PRIMARY KEY,
|
||||||
|
nickname TEXT,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE profiles_discord(
|
||||||
|
linkid SERIAL PRIMARY KEY,
|
||||||
|
profileid INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
userid BIGINT NOT NULL,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX profiles_discord_profileid ON profiles_discord (profileid);
|
||||||
|
CREATE INDEX profiles_discord_userid ON profiles_discord (userid);
|
||||||
|
|
||||||
|
CREATE TABLE profiles_twitch(
|
||||||
|
linkid SERIAL PRIMARY KEY,
|
||||||
|
profileid INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
userid BIGINT NOT NULL,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX profiles_twitch_profileid ON profiles_twitch (profileid);
|
||||||
|
CREATE INDEX profiles_twitch_userid ON profiles_twitch (userid);
|
||||||
|
|
||||||
|
CREATE TABLE communities(
|
||||||
|
communityid SERIAL PRIMARY KEY,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE communities_discord(
|
||||||
|
guildid BIGINT PRIMARY KEY,
|
||||||
|
communityid INTEGER NOT NULL REFERENCES communities (communityid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
linked_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX communities_discord_communityid ON communities_discord (communityid);
|
||||||
|
|
||||||
|
CREATE TABLE communities_twitch(
|
||||||
|
channelid BIGINT PRIMARY KEY,
|
||||||
|
communityid INTEGER NOT NULL REFERENCES communities (communityid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
linked_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX communities_twitch_communityid ON communities_twitch (communityid);
|
||||||
|
|
||||||
|
CREATE TABLE community_members(
|
||||||
|
memberid SERIAL PRIMARY KEY,
|
||||||
|
communityid INTEGER NOT NULL REFERENCES communities (communityud) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
profileid INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
)
|
||||||
|
CREATE UNIQUE INDEX community_members_communityid_profileid ON community_members (communityid, profileid);
|
||||||
|
-- }}}
|
||||||
|
|
||||||
|
-- Twitch Auth {{
|
||||||
|
CREATE TABLE twitch_tokens(
|
||||||
|
userid BIGINT PRIMARY KEY,
|
||||||
|
access_token TEXT NOT NULL,
|
||||||
|
expires_at TIMESTAMPTZ NOT NULL,
|
||||||
|
refresh_token TEXT NOT NULL,
|
||||||
|
obtained_at TIMESTAMPTZ
|
||||||
|
);
|
||||||
|
-- }}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Analytics Data {{{
|
-- Analytics Data {{{
|
||||||
CREATE SCHEMA "analytics";
|
CREATE SCHEMA "analytics";
|
||||||
|
|||||||
8
src/modules/profiles/__init__.py
Normal file
8
src/modules/profiles/__init__.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import logging
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
from .cog import ProfileCog
|
||||||
|
|
||||||
|
async def setup(bot):
|
||||||
|
await bot.add_cog(ProfileCog(bot))
|
||||||
72
src/modules/profiles/cog.py
Normal file
72
src/modules/profiles/cog.py
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import asyncio
|
||||||
|
from enum import Enum
|
||||||
|
from typing import Optional
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
import discord
|
||||||
|
from discord.ext import commands as cmds
|
||||||
|
import twitchio
|
||||||
|
from twitchio.ext import commands
|
||||||
|
|
||||||
|
|
||||||
|
from data.queries import ORDER
|
||||||
|
from meta import LionCog, LionBot, CrocBot
|
||||||
|
from utils.lib import utc_now
|
||||||
|
from . import logger
|
||||||
|
from .data import ProfileData
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfile:
|
||||||
|
def __init__(self):
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
class ProfileCog(LionCog):
|
||||||
|
def __init__(self, bot: LionBot):
|
||||||
|
self.bot = bot
|
||||||
|
self.data = bot.db.load_registry(ProfileData())
|
||||||
|
|
||||||
|
async def cog_load(self):
|
||||||
|
await self.data.init()
|
||||||
|
|
||||||
|
async def cog_check(self, ctx):
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Profile API
|
||||||
|
async def fetch_profile_discord(self, userid: int, create=True):
|
||||||
|
"""
|
||||||
|
Fetch or create a UserProfile from the given Discord userid.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
async def fetch_profile_twitch(self, userid: int, create=True):
|
||||||
|
"""
|
||||||
|
Fetch or create a UserProfile from the given Twitch userid.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
async def fetch_profile(self, profileid: int):
|
||||||
|
"""
|
||||||
|
Fetch a UserProfile by the given id.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
async def merge_profiles(self, sourceid: int, targetid: int):
|
||||||
|
"""
|
||||||
|
Merge two UserProfiles by id.
|
||||||
|
Merges the 'sourceid' into the 'targetid'.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
async def fetch_community_discord(self, guildid: int, create=True):
|
||||||
|
...
|
||||||
|
|
||||||
|
async def fetch_community_twitch(self, guildid: int, create=True):
|
||||||
|
...
|
||||||
|
|
||||||
|
async def fetch_community(self, communityid: int):
|
||||||
|
...
|
||||||
|
|
||||||
|
# ----- Profile Commands -----
|
||||||
|
|
||||||
|
# Link twitch profile
|
||||||
134
src/modules/profiles/data.py
Normal file
134
src/modules/profiles/data.py
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
from data import Registry, RowModel
|
||||||
|
from data.columns import Integer, String, Timestamp
|
||||||
|
|
||||||
|
|
||||||
|
class ProfileData(Registry):
|
||||||
|
class UserProfileRow(RowModel):
|
||||||
|
"""
|
||||||
|
Schema
|
||||||
|
------
|
||||||
|
CREATE TABLE user_profiles(
|
||||||
|
profileid SERIAL PRIMARY KEY,
|
||||||
|
nickname TEXT,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
"""
|
||||||
|
_tablename_ = 'user_profiles'
|
||||||
|
_cache_ = {}
|
||||||
|
|
||||||
|
profileid = Integer(primary=True)
|
||||||
|
nickname = String()
|
||||||
|
created_at = Timestamp()
|
||||||
|
|
||||||
|
class DiscordProfileRow(RowModel):
|
||||||
|
"""
|
||||||
|
Schema
|
||||||
|
------
|
||||||
|
CREATE TABLE profiles_discord(
|
||||||
|
linkid SERIAL PRIMARY KEY,
|
||||||
|
profileid INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
userid BIGINT NOT NULL,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX profiles_discord_profileid ON profiles_discord (profileid);
|
||||||
|
CREATE INDEX profiles_discord_userid ON profiles_discord (userid);
|
||||||
|
"""
|
||||||
|
_tablename_ = 'profiles_discord'
|
||||||
|
_cache_ = {}
|
||||||
|
|
||||||
|
linkid = Integer(primary=True)
|
||||||
|
profileid = Integer()
|
||||||
|
userid = Integer()
|
||||||
|
created_at = Integer()
|
||||||
|
|
||||||
|
class TwitchProfileRow(RowModel):
|
||||||
|
"""
|
||||||
|
Schema
|
||||||
|
------
|
||||||
|
CREATE TABLE profiles_twitch(
|
||||||
|
linkid SERIAL PRIMARY KEY,
|
||||||
|
profileid INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
userid BIGINT NOT NULL,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX profiles_twitch_profileid ON profiles_twitch (profileid);
|
||||||
|
CREATE INDEX profiles_twitch_userid ON profiles_twitch (userid);
|
||||||
|
"""
|
||||||
|
_tablename_ = 'profiles_twitch'
|
||||||
|
_cache_ = {}
|
||||||
|
|
||||||
|
linkid = Integer(primary=True)
|
||||||
|
profileid = Integer()
|
||||||
|
userid = Integer()
|
||||||
|
created_at = Timestamp()
|
||||||
|
|
||||||
|
class CommunityRow(RowModel):
|
||||||
|
"""
|
||||||
|
Schema
|
||||||
|
------
|
||||||
|
CREATE TABLE communities(
|
||||||
|
communityid SERIAL PRIMARY KEY,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
"""
|
||||||
|
_tablename_ = 'communities'
|
||||||
|
_cache_ = {}
|
||||||
|
|
||||||
|
communityid = Integer(primary=True)
|
||||||
|
created_at = Timestamp()
|
||||||
|
|
||||||
|
class DiscordCommunityRow(RowModel):
|
||||||
|
"""
|
||||||
|
Schema
|
||||||
|
------
|
||||||
|
CREATE TABLE communities_discord(
|
||||||
|
guildid BIGINT PRIMARY KEY,
|
||||||
|
communityid INTEGER NOT NULL REFERENCES communities (communityid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
linked_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX communities_discord_communityid ON communities_discord (communityid);
|
||||||
|
"""
|
||||||
|
_tablename_ = 'communities_discord'
|
||||||
|
_cache_ = {}
|
||||||
|
|
||||||
|
guildid = Integer(primary=True)
|
||||||
|
communityid = Integer()
|
||||||
|
linked_at = Timestamp()
|
||||||
|
|
||||||
|
class TwitchCommunityRow(RowModel):
|
||||||
|
"""
|
||||||
|
Schema
|
||||||
|
------
|
||||||
|
CREATE TABLE communities_twitch(
|
||||||
|
channelid BIGINT PRIMARY KEY,
|
||||||
|
communityid INTEGER NOT NULL REFERENCES communities (communityid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
linked_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX communities_twitch_communityid ON communities_twitch (communityid);
|
||||||
|
"""
|
||||||
|
_tablename_ = 'communities_twitch'
|
||||||
|
_cache_ = {}
|
||||||
|
|
||||||
|
channelid = Integer(primary=True)
|
||||||
|
communityid = Integer()
|
||||||
|
linked_at = Timestamp()
|
||||||
|
|
||||||
|
class CommunityMemberRow(RowModel):
|
||||||
|
"""
|
||||||
|
Schema
|
||||||
|
------
|
||||||
|
CREATE TABLE community_members(
|
||||||
|
memberid SERIAL PRIMARY KEY,
|
||||||
|
communityid INTEGER NOT NULL REFERENCES communities (communityud) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
profileid INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
)
|
||||||
|
CREATE UNIQUE INDEX community_members_communityid_profileid ON community_members (communityid, profileid);
|
||||||
|
"""
|
||||||
|
_tablename_ = 'community_members'
|
||||||
|
_cache_ = {}
|
||||||
|
|
||||||
|
memberid = Integer(primary=True)
|
||||||
|
communityid = Integer()
|
||||||
|
profileid = Integer()
|
||||||
|
created_at = Timestamp()
|
||||||
Reference in New Issue
Block a user