xiaohongshu
xiaohongshu
discord-py
Build Discord bots using discord.py. Use when the user asks about Discord bot development, discord.py library, bot commands, slash commands, Discord intents, or Discord API integration. Covers Client, Bot, events, commands extension, app_commands, views, buttons, modals, and cogs.
Full skill instructions
This skill provides guidance for building Discord bots with the discord.py library.
import discord
intents = discord.Intents.default()
intents.message_content = True # Required for reading message content
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'Logged in as {client.user}')
@client.event
async def on_message(message):
if message.author == client.user:
return # Ignore self
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
client.run('YOUR_BOT_TOKEN')
Important: Never name your file discord.py - it conflicts with the library.
Intents are required in discord.py 2.0+. They control which events your bot receives.
intents = discord.Intents.default() # Common intents, excludes privileged
intents = discord.Intents.default()
intents.message_content = True # Read message text (privileged)
intents.members = True # Member join/leave events (privileged)
intents.presences = True # Status updates (privileged)
These three intents must ALSO be enabled in the Discord Developer Portal:
Go to: Discord Developer Portal > Your App > Bot > Privileged Gateway Intents
| Use Case | Class | Import |
|---|---|---|
| Basic events, no commands | Client | discord.Client |
| Prefix commands (!help) | Bot | commands.Bot |
| Slash commands | Either + CommandTree | app_commands |
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.command()
async def ping(ctx):
await ctx.send('Pong!')
bot.run('TOKEN')
Common events (decorate with @client.event or @bot.event):
| Event | When it fires |
|---|---|
on_ready() | Bot connected and cache ready |
on_message(message) | Message received |
on_member_join(member) | User joined guild (needs members intent) |
on_member_remove(member) | User left guild |
on_reaction_add(reaction, user) | Reaction added |
on_guild_join(guild) | Bot joined a server |
on_error(event, *args) | Uncaught exception in event |
from discord.ext import commands
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.command()
async def greet(ctx, name: str):
"""Greet someone by name."""
await ctx.send(f'Hello, {name}!')
@bot.command(name='add')
async def add_numbers(ctx, a: int, b: int):
"""Add two numbers."""
await ctx.send(f'{a} + {b} = {a + b}')
@bot.group()
async def settings(ctx):
if ctx.invoked_subcommand is None:
await ctx.send('Use !settings <subcommand>')
@settings.command()
async def show(ctx):
await ctx.send('Current settings: ...')
import discord
from discord import app_commands
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
@tree.command(name='ping', description='Check bot latency')
async def ping(interaction: discord.Interaction):
await interaction.response.send_message(f'Pong! {round(client.latency * 1000)}ms')
@client.event
async def on_ready():
await tree.sync() # Sync commands with Discord
print(f'Synced commands for {client.user}')
client.run('TOKEN')
@tree.command(name='greet', description='Greet a user')
@app_commands.describe(user='The user to greet')
async def greet(interaction: discord.Interaction, user: discord.Member):
await interaction.response.send_message(f'Hello, {user.mention}!')
# In event handler
await message.channel.send('Hello!')
await message.channel.send('With embed', embed=embed)
await message.channel.send('With file', file=discord.File('image.png'))
# Reply to message
await message.reply('Replying to you!')
# In slash command
await interaction.response.send_message('Response')
await interaction.response.send_message('Only you see this', ephemeral=True)
# Edit/followup for slash commands
await interaction.response.defer()
await interaction.followup.send('Delayed response')
@bot.command()
@commands.is_owner()
async def shutdown(ctx):
await ctx.send('Shutting down...')
await bot.close()
@bot.command()
@commands.has_permissions(manage_messages=True)
async def clear(ctx, amount: int):
await ctx.channel.purge(limit=amount + 1)
@bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.MissingPermissions):
await ctx.send('You lack permissions for this command.')
elif isinstance(error, commands.CommandNotFound):
pass # Ignore unknown commands
else:
raise error
When you need up-to-date API details or are unsure about a feature, fetch the official documentation:
# Core API reference
WebFetch: https://discordpy.readthedocs.io/en/latest/api.html
# Commands extension
WebFetch: https://discordpy.readthedocs.io/en/latest/ext/commands/api.html
# Slash commands (app_commands)
WebFetch: https://discordpy.readthedocs.io/en/latest/interactions/api.html
# Intents guide
WebFetch: https://discordpy.readthedocs.io/en/latest/intents.html
# Quickstart guide
WebFetch: https://discordpy.readthedocs.io/en/latest/quickstart.html
# Frequently asked questions
WebFetch: https://discordpy.readthedocs.io/en/latest/faq.html
Always fetch documentation when:
Note: Forum channels are documented in reference.md with examples in examples.md.
xiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience