CREATE TABLE IF NOT EXISTS kickstarter_emails ( pk INTEGER PRIMARY KEY AUTOINCREMENT, guild_id INTEGER NOT NULL, -- Discord Guild.id email_hash TEXT NOT NULL, -- base64(sha256(email.lower.trimmed)) imported_at INTEGER NOT NULL, -- unix timestamp UNIQUE(guild_id, email_hash) ON CONFLICT FAIL ); CREATE TABLE IF NOT EXISTS kickstarter_discord_users ( pk INTEGER PRIMARY KEY AUTOINCREMENT, guild_id INTEGER NOT NULL, -- Discord Guild.id discord_username TEXT NOT NULL, -- Discord Member.name discord_member_id INTEGER DEFAULT NULL, -- resolved member id lookup_status INTEGER NOT NULL DEFAULT 0, -- enum defined in code imported_at INTEGER NOT NULL, -- unix timestamp UNIQUE(guild_id, discord_username COLLATE NOCASE) ON CONFLICT FAIL ); CREATE INDEX IF NOT EXISTS idx_kickstarter_discord_users_discord_member_id ON kickstarter_discord_users (discord_member_id); CREATE TABLE IF NOT EXISTS member_links ( pk INTEGER PRIMARY KEY AUTOINCREMENT, guild_id INTEGER NOT NULL, -- Discord Guild.id member_id INTEGER NOT NULL, -- Discord Member.id email_hash TEXT NOT NULL, -- base64(sha256(email.lower.trimmed)) complete INTEGER NOT NULL DEFAULT 0, -- link found, role assigned successfully UNIQUE(guild_id, member_id) ON CONFLICT FAIL, UNIQUE(guild_id, email_hash) ON CONFLICT FAIL );