# Discord Shared

> Common Discord types: User, Guild, and Channel.

- Name: `discord-shared`
- Categories: discord
- Detail page: https://open-types.dev/types/discord-shared

## Install

```bash
# Types only
npx shadcn add @open-types/discord-shared

# Types + Zod v4 validators
npx shadcn add @open-types/discord-shared-zod

# Types + real-world examples
npx shadcn add @open-types/discord-shared-examples
```

## Types

```typescript
export interface DiscordUser {
  id: string;
  username: string;
  discriminator: string;
  avatar: string | null;
  bot?: boolean;
  system?: boolean;
  public_flags?: number;
}

export interface DiscordGuild {
  id: string;
  name: string;
  icon: string | null;
  owner_id: string;
  member_count?: number;
}

export interface DiscordChannel {
  id: string;
  type: number;
  guild_id?: string;
  name?: string | null;
  topic?: string | null;
  position?: number;
}
```

## Zod validator

```typescript
import * as z from "zod";
import type {
  DiscordUser,
  DiscordGuild,
  DiscordChannel,
} from "../types/discord-shared";

export const discordUserSchema = z.object({
  id: z.string(),
  username: z.string(),
  discriminator: z.string(),
  avatar: z.string().nullable(),
  bot: z.boolean().optional(),
  system: z.boolean().optional(),
  public_flags: z.number().optional(),
}) satisfies z.ZodType<DiscordUser>;

export const discordGuildSchema = z.object({
  id: z.string(),
  name: z.string(),
  icon: z.string().nullable(),
  owner_id: z.string(),
  member_count: z.number().optional(),
}) satisfies z.ZodType<DiscordGuild>;

export const discordChannelSchema = z.object({
  id: z.string(),
  type: z.number(),
  guild_id: z.string().optional(),
  name: z.string().nullable().optional(),
  topic: z.string().nullable().optional(),
  position: z.number().optional(),
}) satisfies z.ZodType<DiscordChannel>;

export type {
  DiscordUser,
  DiscordGuild,
  DiscordChannel,
} from "../types/discord-shared";
```

## Examples

```typescript
// Source: https://discord.com/developers/docs/resources/user, /guild, /channel
// Captured: 2026-05
import type {
  DiscordUser,
  DiscordGuild,
  DiscordChannel,
} from "../types/discord-shared";
import {
  discordIds,
  discordUserOpenTypes,
  discordUserHuman,
} from "./shared/discord.examples";

export const discordUserExamples = {
  bot: discordUserOpenTypes,
  human: discordUserHuman,
  nullAvatar: { ...discordUserOpenTypes, avatar: null } satisfies DiscordUser,
  systemUser: {
    id: "643945264868098049",
    username: "Discord",
    discriminator: "0000",
    avatar: null,
    system: true,
  } satisfies DiscordUser,
} as const;

export const discordGuildExamples = {
  full: {
    id: discordIds.guild,
    name: "Open Types",
    icon: "guild_icon_hash",
    owner_id: discordIds.user,
    member_count: 42,
  } satisfies DiscordGuild,
  nullIcon: {
    id: discordIds.guild,
    name: "Open Types",
    icon: null,
    owner_id: discordIds.user,
  } satisfies DiscordGuild,
  largeServer: {
    id: "111122223333444455",
    name: "Big Community",
    icon: "big_icon_hash",
    owner_id: discordIds.user,
    member_count: 25000,
  } satisfies DiscordGuild,
} as const;

export const discordChannelExamples = {
  textChannel: {
    id: discordIds.channel,
    type: 0,
    guild_id: discordIds.guild,
    name: "general",
    topic: "Registry updates",
    position: 1,
  } satisfies DiscordChannel,
  voiceChannel: {
    id: "1111111112",
    type: 2,
    guild_id: discordIds.guild,
    name: "voice-1",
    position: 2,
  } satisfies DiscordChannel,
  dmChannel: { id: "1111111113", type: 1 } satisfies DiscordChannel,
  announcement: {
    id: "1111111114",
    type: 5,
    guild_id: discordIds.guild,
    name: "announcements",
    topic: null,
    position: 0,
  } satisfies DiscordChannel,
  minimal: { id: "1111111115", type: 0 } satisfies DiscordChannel,
} as const;
```
