Corsair
PluginsDiscord

Discord Database Schema

Database entities and querying synced Discord data

The Discord plugin syncs data from Discord to your database, enabling fast queries without making API calls.

New to Corsair? Learn about database operations, data synchronization, and multi-tenancy.

Full Implementation: See the Discord plugin source code.

Synced Entities

  • guilds - Server information and metadata
  • channels - Channel information per guild
  • members - Guild member data
  • messages - Message history

Database API

Access synced data through the db property:

const guilds = await corsair.discord.db.guilds.search({
    data: { name: "My Server" },
});

Search Options

await corsair.discord.db.guilds.search({
    data: { name: "My Server" },
    limit: 100,
    offset: 0,
});

Guilds

Guild data is synced when the bot joins a server or fetches guild info.

Schema

{
    id: string;          // Discord guild (server) ID
    name: string;        // Server name
    icon?: string;       // Icon hash
    owner_id?: string;   // Owner user ID
    member_count?: number;
}

Querying Guilds

Search by name:

const guilds = await corsair.discord.db.guilds.search({
    data: { name: "My Server" }, 
});

Get a specific guild:

const guild = await corsair.discord.db.guilds.search({
    data: { id: "9876543210" },
});

Channels

Schema

{
    id: string;           // Channel ID
    guild_id: string;     // Parent guild ID
    name: string;         // Channel name
    type: number;         // Channel type (0=text, 2=voice, etc.)
    topic?: string;       // Channel topic
    position?: number;    // Channel order position
    parent_id?: string;   // Category ID
}

Querying Channels

Search by guild:

const channels = await corsair.discord.db.channels.search({
    data: { guild_id: "9876543210" }, 
});

Find text channels:

const textChannels = await corsair.discord.db.channels.search({
    data: { guild_id: "9876543210", type: 0 },
});

Members

Schema

{
    user_id: string;      // User ID
    guild_id: string;     // Guild ID
    username: string;     // Username
    discriminator?: string;
    nick?: string;        // Server nickname
    roles: string[];      // Role IDs
    joined_at?: string;   // When they joined
}

Querying Members

Search by guild:

const members = await corsair.discord.db.members.search({
    data: { guild_id: "9876543210" }, 
    limit: 100,
});

Example: Find Members with a Role

const mods = await corsair.discord.db.members.search({
    data: { guild_id: "9876543210" },
});

const modRole = "MOD_ROLE_ID";
const moderators = mods.data.filter(m => m.roles.includes(modRole)); 

Messages

Schema

{
    id: string;           // Message ID
    channel_id: string;   // Channel ID
    guild_id?: string;    // Guild ID
    author_id: string;    // User ID of sender
    content: string;      // Message text
    timestamp: string;    // When message was sent
    edited_timestamp?: string;
    type: number;         // Message type
}

Querying Messages

Search by channel:

const messages = await corsair.discord.db.messages.search({
    data: { channel_id: "1234567890" }, 
    limit: 50,
});

Example: Multi-Tenancy Database Query

const tenant = corsair.withTenant("user-123");

const recentMessages = await tenant.discord.db.messages.search({
    data: { channel_id: "1234567890" },
    limit: 10,
});