NekoBot supports Discord platform through Discord Bot API.
Edit data/platforms_sources.json:
{
"discord": {
"type": "discord",
"enable": true,
"id": "discord",
"token": "your-bot-token-here",
"command_prefix": "/"
}
}Set up Bot permissions in Discord Developer Portal:
Send Messages - Send messagesEmbed Links - Embed linksAttach Files - Attach filesRead Message History - Read message historyAdd Reactions - Add reactionsUse Slash Commands - Use slash commandsGenerate invite link:
https://discord.com/api/oauth2/authorize?client_id=YOUR_CLIENT_ID&permissions=8&scope=botOr use Discord Developer Portal's "OAuth2" page to generate invite link.
| Event Type | Description |
|---|---|
| Message Create | New message |
| Message Update | Message edited |
| Message Delete | Message deleted |
| Reaction Add | Reaction added |
| Reaction Remove | Reaction removed |
| Member Join | Member joins server |
| Member Leave | Member leaves server |
Discord messages use Markdown format:
# Plain text
message = "Hello World!"
# Bold
message = "**Bold Text**"
# Italic
message = "*Italic Text*"
# Code
message = "`Code`"
# Code block
message = "```python\nprint('Hello')\n```"
# Link
message = "[Text](https://example.com)"
# Mention user
message = f"<@{user_id}>"
# Mention role
message = f"<@&{role_id}>"Discord supports embed messages:
async def send_embed(self, channel_id, title, description):
embed = {
"title": title,
"description": description,
"color": 0x00ff00,
"fields": [
{"name": "Field1", "value": "Value1", "inline": True},
{"name": "Field2", "value": "Value2", "inline": True}
],
"footer": {"text": "NekoBot"},
"timestamp": "2025-01-01T00:00:00Z"
}
await self.platform_server.call_platform_api(
platform_id="discord",
action="send_embed",
params={"channel_id": channel_id, "embed": embed}
)Discord supports slash commands:
async def register_slash_command(self, name, description):
await self.platform_server.call_platform_api(
platform_id="discord",
action="register_command",
params={
"name": name,
"description": description,
"options": [
{
"name": "option1",
"description": "Option1",
"type": 3, # STRING
"required": True
}
]
}
)async def on_message(self, message):
if message.get("type") == "interaction":
interaction = message
command_name = interaction.get("data", {}).get("name")
if command_name == "hello":
await self.respond_to_interaction(
interaction_id=interaction["id"],
interaction_token=interaction["token"],
content="Hello!"
)async def send_file(self, channel_id, file_path):
with open(file_path, "rb") as f:
await self.platform_server.call_platform_api(
platform_id="discord",
action="send_file",
params={"channel_id": channel_id, "file": f}
)async def get_guild_info(self, guild_id):
result = await self.platform_server.call_platform_api(
platform_id="discord",
action="get_guild",
params={"guild_id": guild_id}
)
return result.get("data")async def get_members(self, guild_id):
result = await self.platform_server.call_platform_api(
platform_id="discord",
action="get_members",
params={"guild_id": guild_id}
)
return result.get("data", [])Discord API has rate limits:
| Operation Type | Limit |
|---|---|
| Global | 50 requests/second |
| Per channel | 5 requests/5 seconds |
| Per member | 1 request/second |
Implement a request queue to avoid triggering limits.
If you encounter rate limit errors: