{"id":"53428ea7-14e4-4b3f-b927-af5ad6442bc0","shortId":"hwH2nx","kind":"skill","title":"Discord Bot Architect","tagline":"Antigravity Awesome Skills skill by Sickn33","description":"# Discord Bot Architect\n\nSpecialized skill for building production-ready Discord bots.\nCovers Discord.js (JavaScript) and Pycord (Python), gateway intents,\nslash commands, interactive components, rate limiting, and sharding.\n\n## Principles\n\n- Slash commands over message parsing (Message Content Intent deprecated)\n- Acknowledge interactions within 3 seconds, always\n- Request only required intents (minimize privileged intents)\n- Handle rate limits gracefully with exponential backoff\n- Plan for sharding from the start (required at 2500+ guilds)\n- Use components (buttons, selects, modals) for rich UX\n- Test with guild commands first, deploy global when ready\n\n## Patterns\n\n### Discord.js v14 Foundation\n\nModern Discord bot setup with Discord.js v14 and slash commands\n\n**When to use**: Building Discord bots with JavaScript/TypeScript,Need full gateway connection with events,Building bots with complex interactions\n\n```javascript\n// src/index.js\nconst { Client, Collection, GatewayIntentBits, Events } = require('discord.js');\nconst fs = require('node:fs');\nconst path = require('node:path');\nrequire('dotenv').config();\n\n// Create client with minimal required intents\nconst client = new Client({\n  intents: [\n    GatewayIntentBits.Guilds,\n    // Add only what you need:\n    // GatewayIntentBits.GuildMessages,\n    // GatewayIntentBits.MessageContent,  // PRIVILEGED - avoid if possible\n  ]\n});\n\n// Load commands\nclient.commands = new Collection();\nconst commandsPath = path.join(__dirname, 'commands');\nconst commandFiles = fs.readdirSync(commandsPath).filter(f => f.endsWith('.js'));\n\nfor (const file of commandFiles) {\n  const filePath = path.join(commandsPath, file);\n  const command = require(filePath);\n  if ('data' in command && 'execute' in command) {\n    client.commands.set(command.data.name, command);\n  }\n}\n\n// Load events\nconst eventsPath = path.join(__dirname, 'events');\nconst eventFiles = fs.readdirSync(eventsPath).filter(f => f.endsWith('.js'));\n\nfor (const file of eventFiles) {\n  const filePath = path.join(eventsPath, file);\n  const event = require(filePath);\n  if (event.once) {\n    client.once(event.name, (...args) => event.execute(...args));\n  } else {\n    client.on(event.name, (...args) => event.execute(...args));\n  }\n}\n\nclient.login(process.env.DISCORD_TOKEN);\n```\n\n```javascript\n// src/commands/ping.js\nconst { SlashCommandBuilder } = require('discord.js');\n\nmodule.exports = {\n  data: new SlashCommandBuilder()\n    .setName('ping')\n    .setDescription('Replies with Pong!'),\n\n  async execute(interaction) {\n    const sent = await interaction.reply({\n      content: 'Pinging...',\n      fetchReply: true\n    });\n\n    const latency = sent.createdTimestamp - interaction.createdTimestamp;\n    await interaction.editReply(`Pong! Latency: ${latency}ms`);\n  }\n};\n```\n\n```javascript\n// src/events/interactionCreate.js\nconst { Events } = require('discord.js');\n\nmodule.exports = {\n  name: Events.InteractionCreate,\n  async execute(interaction) {\n    if (!interaction.isChatInputCommand()) return;\n\n    const command = interaction.client.commands.get(interaction.commandName);\n    if (!command) {\n      console.error(`No command matching ${interaction.commandName}`);\n      return;\n    }\n\n    try {\n      await command.execute(interaction);\n    } catch (error) {\n      console.error(error);\n      const reply = {\n        content: 'There was an error executing this command!',\n        ephemeral: true\n      };\n\n      if (interaction.replied || interaction.deferred) {\n        await interaction.followUp(reply);\n      } else {\n        await interaction.reply(reply);\n      }\n    }\n  }\n};\n```\n\n```javascript\n// src/deploy-commands.js\nconst { REST, Routes } = require('discord.js');\nconst fs = require('node:fs');\nconst path = require('node:path');\nrequire('dotenv').config();\n\nconst commands = [];\nconst commandsPath = path.join(__dirname, 'commands');\nconst commandFiles = fs.readdirSync(commandsPath).filter(f => f.endsWith('.js'));\n\nfor (const file of commandFiles) {\n  const command = require(path.join(commandsPath, file));\n  commands.push(command.data.toJSON());\n}\n\nconst rest = new REST().setToken(process.env.DISCORD_TOKEN);\n\n(async () => {\n  try {\n    console.log(`Refreshing ${commands.length} commands...`);\n\n    // Guild commands (instant, for testing)\n    // const data = await rest.put(\n    //   Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID),\n    //   { body: commands }\n    // );\n\n    // Global commands (can take up to 1 hour to propagate)\n    const data = await rest.put(\n      Routes.applicationCommands(process.env.CLIENT_ID),\n      { body: commands }\n    );\n\n    console.log(`Successfully registered ${data.length} commands`);\n  } catch (error) {\n    console.error(error);\n  }\n})();\n```\n\n### Structure\n\ndiscord-bot/\n├── src/\n│   ├── index.js           # Main entry point\n│   ├── deploy-commands.js # Command registration script\n│   ├── commands/          # Slash command handlers\n│   │   └── ping.js\n│   └── events/            # Event handlers\n│       ├── ready.js\n│       └── interactionCreate.js\n├── .env\n└── package.json\n\n### Pycord Bot Foundation\n\nDiscord bot with Pycord (Python) and application commands\n\n**When to use**: Building Discord bots with Python,Prefer async/await patterns,Need good slash command support\n\n```python\n# main.py\nimport os\nimport discord\nfrom discord.ext import commands\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n# Configure intents - only enable what you need\nintents = discord.Intents.default()\n# intents.message_content = True  # PRIVILEGED - avoid if possible\n# intents.members = True          # PRIVILEGED\n\nbot = commands.Bot(\n    command_prefix=\"!\",  # Legacy, prefer slash commands\n    intents=intents\n)\n\n@bot.event\nasync def on_ready():\n    print(f\"Logged in as {bot.user}\")\n    # Sync commands (do this carefully - see sharp edges)\n    # await bot.sync_commands()\n\n# Slash command\n@bot.slash_command(name=\"ping\", description=\"Check bot latency\")\nasync def ping(ctx: discord.ApplicationContext):\n    latency = round(bot.latency * 1000)\n    await ctx.respond(f\"Pong! Latency: {latency}ms\")\n\n# Slash command with options\n@bot.slash_command(name=\"greet\", description=\"Greet a user\")\nasync def greet(\n    ctx: discord.ApplicationContext,\n    user: discord.Option(discord.Member, \"User to greet\"),\n    message: discord.Option(str, \"Custom message\", required=False)\n):\n    msg = message or \"Hello!\"\n    await ctx.respond(f\"{user.mention}, {msg}\")\n\n# Load cogs\nfor filename in os.listdir(\"./cogs\"):\n    if filename.endswith(\".py\"):\n        bot.load_extension(f\"cogs.{filename[:-3]}\")\n\nbot.run(os.environ[\"DISCORD_TOKEN\"])\n```\n\n```python\n# cogs/general.py\nimport discord\nfrom discord.ext import commands\n\nclass General(commands.Cog):\n    def __init__(self, bot):\n        self.bot = bot\n\n    @commands.slash_command(name=\"info\", description=\"Bot information\")\n    async def info(self, ctx: discord.ApplicationContext):\n        embed = discord.Embed(\n            title=\"Bot Info\",\n            description=\"A helpful Discord bot\",\n            color=discord.Color.blue()\n        )\n        embed.add_field(name=\"Servers\", value=len(self.bot.guilds))\n        embed.add_field(name=\"Latency\", value=f\"{round(self.bot.latency * 1000)}ms\")\n        await ctx.respond(embed=embed)\n\n    @commands.Cog.listener()\n    async def on_member_join(self, member: discord.Member):\n        # Requires Members intent (PRIVILEGED)\n        channel = member.guild.system_channel\n        if channel:\n            await channel.send(f\"Welcome {member.mention}!\")\n\ndef setup(bot):\n    bot.add_cog(General(bot))\n```\n\n### Structure\n\ndiscord-bot/\n├── main.py           # Main bot file\n├── cogs/             # Command groups\n│   └── general.py\n├── .env\n└── requirements.txt\n\n### Interactive Components Pattern\n\nUsing buttons, select menus, and modals for rich UX\n\n**When to use**: Need interactive user interfaces,Collecting user input beyond slash command options,Building menus, confirmations, or forms\n\n```javascript\n// Discord.js - Buttons and Select Menus\nconst {\n  SlashCommandBuilder,\n  ActionRowBuilder,\n  ButtonBuilder,\n  ButtonStyle,\n  StringSelectMenuBuilder,\n  ModalBuilder,\n  TextInputBuilder,\n  TextInputStyle\n} = require('discord.js');\n\nmodule.exports = {\n  data: new SlashCommandBuilder()\n    .setName('menu')\n    .setDescription('Shows an interactive menu'),\n\n  async execute(interaction) {\n    // Button row\n    const buttonRow = new ActionRowBuilder()\n      .addComponents(\n        new ButtonBuilder()\n          .setCustomId('confirm')\n          .setLabel('Confirm')\n          .setStyle(ButtonStyle.Primary),\n        new ButtonBuilder()\n          .setCustomId('cancel')\n          .setLabel('Cancel')\n          .setStyle(ButtonStyle.Danger),\n        new ButtonBuilder()\n          .setLabel('Documentation')\n          .setURL('https://discord.js.org')\n          .setStyle(ButtonStyle.Link)  // Link buttons don't emit events\n      );\n\n    // Select menu row (one per row, takes all 5 slots)\n    const selectRow = new ActionRowBuilder()\n      .addComponents(\n        new StringSelectMenuBuilder()\n          .setCustomId('select-role')\n          .setPlaceholder('Select a role')\n          .setMinValues(1)\n          .setMaxValues(3)\n          .addOptions([\n            { label: 'Developer', value: 'dev', emoji: '💻' },\n            { label: 'Designer', value: 'design', emoji: '🎨' },\n            { label: 'Community', value: 'community', emoji: '🎉' }\n          ])\n      );\n\n    await interaction.reply({\n      content: 'Choose an option:',\n      components: [buttonRow, selectRow]\n    });\n\n    // Collect responses\n    const collector = interaction.channel.createMessageComponentCollector({\n      filter: i => i.user.id === interaction.user.id,\n      time: 60_000  // 60 seconds timeout\n    });\n\n    collector.on('collect', async i => {\n      if (i.customId === 'confirm') {\n        await i.update({ content: 'Confirmed!', components: [] });\n        collector.stop();\n      } else if (i.customId === 'cancel') {\n        await i.update({ content: 'Cancelled', components: [] });\n        collector.stop();\n      } else if (i.customId === 'select-role') {\n        await i.update({ content: `You selected: ${i.values.join(', ')}` });\n      }\n    });\n  }\n};\n```\n\n```javascript\n// Modals (forms)\nmodule.exports = {\n  data: new SlashCommandBuilder()\n    .setName('feedback')\n    .setDescription('Submit feedback'),\n\n  async execute(interaction) {\n    const modal = new ModalBuilder()\n      .setCustomId('feedback-modal')\n      .setTitle('Submit Feedback');\n\n    const titleInput = new TextInputBuilder()\n      .setCustomId('feedback-title')\n      .setLabel('Title')\n      .setStyle(TextInputStyle.Short)\n      .setRequired(true)\n      .setMaxLength(100);\n\n    const bodyInput = new TextInputBuilder()\n      .setCustomId('feedback-body')\n      .setLabel('Your feedback')\n      .setStyle(TextInputStyle.Paragraph)\n      .setRequired(true)\n      .setMaxLength(1000)\n      .setPlaceholder('Describe your feedback...');\n\n    modal.addComponents(\n      new ActionRowBuilder().addComponents(titleInput),\n      new ActionRowBuilder().addComponents(bodyInput)\n    );\n\n    // Show modal - MUST be first response\n    await interaction.showModal(modal);\n  }\n};\n\n// Handle modal submission in interactionCreate\nif (interaction.isModalSubmit()) {\n  if (interaction.customId === 'feedback-modal') {\n    const title = interaction.fields.getTextInputValue('feedback-title');\n    const body = interaction.fields.getTextInputValue('feedback-body');\n\n    await interaction.reply({\n      content: `Thanks for your feedback!\\n**${title}**\\n${body}`,\n      ephemeral: true\n    });\n  }\n}\n```\n\n```python\n# Pycord - Buttons and Views\nimport discord\n\nclass ConfirmView(discord.ui.View):\n    def __init__(self):\n        super().__init__(timeout=60)\n        self.value = None\n\n    @discord.ui.button(label=\"Confirm\", style=discord.ButtonStyle.green)\n    async def confirm(self, button, interaction):\n        self.value = True\n        await interaction.response.edit_message(content=\"Confirmed!\", view=None)\n        self.stop()\n\n    @discord.ui.button(label=\"Cancel\", style=discord.ButtonStyle.red)\n    async def cancel(self, button, interaction):\n        self.value = False\n        await interaction.response.edit_message(content=\"Cancelled\", view=None)\n        self.stop()\n\n@bot.slash_command(name=\"confirm\")\nasync def confirm_cmd(ctx: discord.ApplicationContext):\n    view = ConfirmView()\n    await ctx.respond(\"Are you sure?\", view=view)\n\n    await view.wait()  # Wait for user interaction\n    if view.value is None:\n        await ctx.followup.send(\"Timed out\")\n\n# Select Menu\nclass RoleSelect(discord.ui.Select):\n    def __init__(self):\n        options = [\n            discord.SelectOption(label=\"Developer\", value=\"dev\", emoji=\"💻\"),\n            discord.SelectOption(label=\"Designer\", value=\"design\", emoji=\"🎨\"),\n        ]\n        super().__init__(\n            placeholder=\"Select roles...\",\n            min_values=1,\n            max_values=2,\n            options=options\n        )\n\n    async def callback(self, interaction):\n        await interaction.response.send_message(\n            f\"You selected: {', '.join(self.values)}\",\n            ephemeral=True\n        )\n\nclass RoleView(discord.ui.View):\n    def __init__(self):\n        super().__init__()\n        self.add_item(RoleSelect())\n\n# Modal\nclass FeedbackModal(discord.ui.Modal):\n    def __init__(self):\n        super().__init__(title=\"Submit Feedback\")\n\n        self.add_item(discord.ui.InputText(\n            label=\"Title\",\n            style=discord.InputTextStyle.short,\n            required=True,\n            max_length=100\n        ))\n        self.add_item(discord.ui.InputText(\n            label=\"Feedback\",\n            style=discord.InputTextStyle.long,\n            required=True,\n            max_length=1000\n        ))\n\n    async def callback(self, interaction):\n        title = self.children[0].value\n        body = self.children[1].value\n        await interaction.response.send_message(\n            f\"Thanks!\\n**{title}**\\n{body}\",\n            ephemeral=True\n        )\n\n@bot.slash_command(name=\"feedback\")\nasync def feedback(ctx: discord.ApplicationContext):\n    await ctx.send_modal(FeedbackModal())\n```\n\n### Limits\n\n- 5 ActionRows per message/modal\n- 5 buttons per ActionRow\n- 1 select menu per ActionRow (takes all 5 slots)\n- 5 select menus max per message\n- 25 options per select menu\n- Modal must be first response (cannot defer first)\n\n### Deferred Response Pattern\n\nHandle slow operations without timing out\n\n**When to use**: Operation takes more than 3 seconds,Database queries, API calls, LLM responses,File processing or generation\n\n```javascript\n// Discord.js - Deferred response\nmodule.exports = {\n  data: new SlashCommandBuilder()\n    .setName('slow-task')\n    .setDescription('Performs a slow operation'),\n\n  async execute(interaction) {\n    // Defer immediately - you have 3 seconds!\n    await interaction.deferReply();\n    // For ephemeral: await interaction.deferReply({ ephemeral: true });\n\n    try {\n      // Now you have 15 minutes to complete\n      const result = await slowDatabaseQuery();\n      const aiResponse = await callOpenAI(result);\n\n      // Edit the deferred reply\n      await interaction.editReply({\n        content: `Result: ${aiResponse}`,\n        embeds: [resultEmbed]\n      });\n    } catch (error) {\n      await interaction.editReply({\n        content: 'An error occurred while processing your request.'\n      });\n    }\n  }\n};\n\n// For components (buttons, select menus)\ncollector.on('collect', async i => {\n  await i.deferUpdate();  // Acknowledge without visual change\n  // Or: await i.deferReply({ ephemeral: true });\n\n  const result = await slowOperation();\n  await i.editReply({ content: result });\n});\n```\n\n```python\n# Pycord - Deferred response\n@bot.slash_command(name=\"slow-task\")\nasync def slow_task(ctx: discord.ApplicationContext):\n    # Defer immediately\n    await ctx.defer()\n    # For ephemeral: await ctx.defer(ephemeral=True)\n\n    try:\n        result = await slow_database_query()\n        ai_response = await call_openai(result)\n\n        await ctx.followup.send(f\"Result: {ai_response}\")\n    except Exception as e:\n        await ctx.followup.send(\"An error occurred\")\n```\n\n### Timing\n\n- Initial_response: 3 seconds\n- Deferred_followup: 15 minutes\n- Ephemeral_note: Can only be set on initial response, not changed later\n\n### Embed Builder Pattern\n\nRich embedded messages for professional-looking content\n\n**When to use**: Displaying formatted information,Status updates, help menus, logs,Data with structure (fields, images)\n\n```javascript\nconst { EmbedBuilder, Colors } = require('discord.js');\n\n// Basic embed\nconst embed = new EmbedBuilder()\n  .setColor(Colors.Blue)\n  .setTitle('Bot Status')\n  .setURL('https://example.com')\n  .setAuthor({\n    name: 'Bot Name',\n    iconURL: client.user.displayAvatarURL()\n  })\n  .setDescription('Current status and statistics')\n  .addFields(\n    { name: 'Servers', value: `${client.guilds.cache.size}`, inline: true },\n    { name: 'Users', value: `${client.users.cache.size}`, inline: true },\n    { name: 'Uptime', value: formatUptime(), inline: true }\n  )\n  .setThumbnail(client.user.displayAvatarURL())\n  .setImage('https://example.com/banner.png')\n  .setTimestamp()\n  .setFooter({\n    text: 'Requested by User',\n    iconURL: interaction.user.displayAvatarURL()\n  });\n\nawait interaction.reply({ embeds: [embed] });\n\n// Multiple embeds (max 10)\nawait interaction.reply({ embeds: [embed1, embed2, embed3] });\n```\n\n```python\n# Pycord\nembed = discord.Embed(\n    title=\"Bot Status\",\n    description=\"Current status and statistics\",\n    color=discord.Color.blue(),\n    url=\"https://example.com\"\n)\nembed.set_author(\n    name=\"Bot Name\",\n    icon_url=bot.user.display_avatar.url\n)\nembed.add_field(name=\"Servers\", value=len(bot.guilds), inline=True)\nembed.add_field(name=\"Users\", value=len(bot.users), inline=True)\nembed.set_thumbnail(url=bot.user.display_avatar.url)\nembed.set_image(url=\"https://example.com/banner.png\")\nembed.set_footer(text=\"Requested by User\", icon_url=ctx.author.display_avatar.url)\nembed.timestamp = discord.utils.utcnow()\n\nawait ctx.respond(embed=embed)\n```\n\n### Limits\n\n- 10 embeds per message\n- 6000 characters total across all embeds\n- 256 characters for title\n- 4096 characters for description\n- 25 fields per embed\n- 256 characters per field name\n- 1024 characters per field value\n\n### Rate Limit Handling Pattern\n\nGracefully handle Discord API rate limits\n\n**When to use**: High-volume operations,Bulk messaging or role assignments,Any repeated API calls\n\n```javascript\n// Discord.js handles rate limits automatically, but for custom handling:\nconst { REST } = require('discord.js');\n\nconst rest = new REST({ version: '10' })\n  .setToken(process.env.DISCORD_TOKEN);\n\nrest.on('rateLimited', (info) => {\n  console.log(`Rate limited! Retry after ${info.retryAfter}ms`);\n  console.log(`Route: ${info.route}`);\n  console.log(`Global: ${info.global}`);\n});\n\n// Queue pattern for bulk operations\nclass RateLimitQueue {\n  constructor() {\n    this.queue = [];\n    this.processing = false;\n    this.requestsPerSecond = 40; // Safe margin below 50\n  }\n\n  async add(operation) {\n    return new Promise((resolve, reject) => {\n      this.queue.push({ operation, resolve, reject });\n      this.process();\n    });\n  }\n\n  async process() {\n    if (this.processing || this.queue.length === 0) return;\n    this.processing = true;\n\n    while (this.queue.length > 0) {\n      const { operation, resolve, reject } = this.queue.shift();\n\n      try {\n        const result = await operation();\n        resolve(result);\n      } catch (error) {\n        reject(error);\n      }\n\n      // Throttle: ~40 requests per second\n      await new Promise(r => setTimeout(r, 1000 / this.requestsPerSecond));\n    }\n\n    this.processing = false;\n  }\n}\n\nconst queue = new RateLimitQueue();\n\n// Usage: Send 200 messages without hitting rate limits\nfor (const user of users) {\n  await queue.add(() => user.send('Welcome!'));\n}\n```\n\n```python\n# Pycord/discord.py handles rate limits automatically\n# For custom handling:\nimport asyncio\nfrom collections import deque\n\nclass RateLimitQueue:\n    def __init__(self, requests_per_second=40):\n        self.queue = deque()\n        self.processing = False\n        self.delay = 1 / requests_per_second\n\n    async def add(self, coro):\n        future = asyncio.Future()\n        self.queue.append((coro, future))\n        if not self.processing:\n            asyncio.create_task(self._process())\n        return await future\n\n    async def _process(self):\n        self.processing = True\n        while self.queue:\n            coro, future = self.queue.popleft()\n            try:\n                result = await coro\n                future.set_result(result)\n            except Exception as e:\n                future.set_exception(e)\n            await asyncio.sleep(self.delay)\n        self.processing = False\n\nqueue = RateLimitQueue()\n\n# Usage\nfor member in guild.members:\n    await queue.add(member.send(\"Welcome!\"))\n```\n\n### Rate_limits\n\n- Global: 50 requests per second\n- Gateway: 120 requests per 60 seconds\n- Specific: Messages to same channel: 5/5s, Bulk delete: 1/1s, Guild member requests: varies by guild size\n\n### Sharding Pattern\n\nScale bots to 2500+ servers with sharding\n\n**When to use**: Bot approaching 2500 guilds (required),Want horizontal scaling,Memory optimization for large bots\n\n```javascript\n// Discord.js Sharding Manager\n// shard.js (main entry)\nconst { ShardingManager } = require('discord.js');\n\nconst manager = new ShardingManager('./bot.js', {\n  token: process.env.DISCORD_TOKEN,\n  totalShards: 'auto',  // Discord determines optimal count\n  // Or specify: totalShards: 4\n});\n\nmanager.on('shardCreate', shard => {\n  console.log(`Launched shard ${shard.id}`);\n\n  shard.on('ready', () => {\n    console.log(`Shard ${shard.id} ready`);\n  });\n\n  shard.on('disconnect', () => {\n    console.log(`Shard ${shard.id} disconnected`);\n  });\n});\n\nmanager.spawn();\n\n// bot.js - Modified for sharding\nconst { Client } = require('discord.js');\n\nconst client = new Client({ intents: [...] });\n\n// Get shard info\nclient.on('ready', () => {\n  console.log(`Shard ${client.shard.ids[0]} ready with ${client.guilds.cache.size} guilds`);\n});\n\n// Cross-shard data\nasync function getTotalGuilds() {\n  const results = await client.shard.fetchClientValues('guilds.cache.size');\n  return results.reduce((acc, count) => acc + count, 0);\n}\n\n// Broadcast to all shards\nasync function broadcastMessage(channelId, message) {\n  await client.shard.broadcastEval(\n    (c, { channelId, message }) => {\n      const channel = c.channels.cache.get(channelId);\n      if (channel) channel.send(message);\n    },\n    { context: { channelId, message } }\n  );\n}\n```\n\n```python\n# Pycord - AutoShardedBot\nimport discord\nfrom discord.ext import commands\n\n# Automatically handles sharding\nbot = commands.AutoShardedBot(\n    command_prefix=\"!\",\n    intents=discord.Intents.default(),\n    shard_count=None  # Auto-determine\n)\n\n@bot.event\nasync def on_ready():\n    print(f\"Logged in on {len(bot.shards)} shards\")\n    for shard_id, shard in bot.shards.items():\n        print(f\"Shard {shard_id}: {shard.latency * 1000:.2f}ms\")\n\n@bot.event\nasync def on_shard_ready(shard_id):\n    print(f\"Shard {shard_id} is ready\")\n\n# Get guilds per shard\nfor shard_id, guilds in bot.guilds_by_shard().items():\n    print(f\"Shard {shard_id}: {len(guilds)} guilds\")\n```\n\n### Scaling_guide\n\n- 1-2500 guilds: No sharding required\n- 2500+ guilds: Sharding required by Discord\n- Recommended: ~1000 guilds per shard\n- Memory: Each shard runs in separate process\n\n## Sharp Edges\n\n### Interaction Timeout (3 Second Rule)\n\nSeverity: CRITICAL\n\nSituation: Handling slash commands, buttons, select menus, or modals\n\nSymptoms:\nUser sees \"This interaction failed\" or \"The application did not respond.\"\nCommand works locally but fails in production.\nSlow operations never complete.\n\nWhy this breaks:\nDiscord requires ALL interactions to be acknowledged within 3 seconds:\n- Slash commands\n- Button clicks\n- Select menu selections\n- Context menu commands\n\nIf you do ANY slow operation (database, API, file I/O) before responding,\nyou'll miss the window. Discord shows an error even if your bot processes\nthe request correctly afterward.\n\nAfter acknowledgment, you have 15 minutes for follow-up responses.\n\nRecommended fix:\n\n## Acknowledge immediately, process later\n\n```javascript\n// Discord.js - Defer for slow operations\nmodule.exports = {\n  async execute(interaction) {\n    // DEFER IMMEDIATELY - before any slow operation\n    await interaction.deferReply();\n    // For ephemeral: await interaction.deferReply({ ephemeral: true });\n\n    // Now you have 15 minutes\n    const result = await slowDatabaseQuery();\n    const aiResponse = await callLLM(result);\n\n    // Edit the deferred reply\n    await interaction.editReply(`Result: ${aiResponse}`);\n  }\n};\n```\n\n```python\n# Pycord\n@bot.slash_command()\nasync def slow_command(ctx):\n    await ctx.defer()  # Acknowledge immediately\n    # await ctx.defer(ephemeral=True)  # For private response\n\n    result = await slow_operation()\n    await ctx.followup.send(f\"Result: {result}\")\n```\n\n## For components (buttons, menus)\n\n```javascript\n// If you're updating the message\nawait interaction.deferUpdate();\n\n// If you're sending a new response\nawait interaction.deferReply({ ephemeral: true });\n```\n\n### Missing Privileged Intent Configuration\n\nSeverity: CRITICAL\n\nSituation: Bot needs member data, presences, or message content\n\nSymptoms:\nMembers intent: member lists empty, on_member_join doesn't fire\nPresences intent: statuses always unknown/offline\nMessage content intent: message.content is empty string\n\nWhy this breaks:\nDiscord has 3 privileged intents that require manual enablement:\n1. **GUILD_MEMBERS** - Member join/leave, member lists\n2. **GUILD_PRESENCES** - Online status, activities\n3. **MESSAGE_CONTENT** - Read message text (deprecated for commands)\n\nThese must be:\n1. Enabled in Discord Developer Portal > Bot > Privileged Gateway Intents\n2. Requested in your bot code\n\nAt 100+ servers, you need Discord verification to keep using them.\n\nRecommended fix:\n\n## Step 1: Enable in Developer Portal\n\n```\n1. Go to https://discord.com/developers/applications\n2. Select your application\n3. Go to Bot section\n4. Scroll to Privileged Gateway Intents\n5. Toggle ON the intents you need\n```\n\n## Step 2: Request in code\n\n```javascript\n// Discord.js\nconst { Client, GatewayIntentBits } = require('discord.js');\n\nconst client = new Client({\n  intents: [\n    GatewayIntentBits.Guilds,\n    GatewayIntentBits.GuildMembers,       // PRIVILEGED\n    // GatewayIntentBits.GuildPresences,  // PRIVILEGED\n    // GatewayIntentBits.MessageContent,  // PRIVILEGED - avoid!\n  ]\n});\n```\n\n```python\n# Pycord\nintents = discord.Intents.default()\nintents.members = True       # PRIVILEGED\n# intents.presences = True   # PRIVILEGED\n# intents.message_content = True  # PRIVILEGED - avoid!\n\nbot = commands.Bot(intents=intents)\n```\n\n## Avoid Message Content Intent if possible\n\nUse slash commands, buttons, and modals instead of message parsing.\nThese don't require the Message Content intent.\n\n### Command Registration Rate Limited\n\nSeverity: HIGH\n\nSituation: Registering slash commands\n\nSymptoms:\nCommands not appearing. 429 errors when deploying.\n\"You are being rate limited\" messages.\nCommands appear for some guilds but not others.\n\nWhy this breaks:\nCommand registration is rate limited:\n- Global commands: 200 creates/day, updates take up to 1 hour to propagate\n- Guild commands: 200 creates/day per guild, instant update\n\nCommon mistakes:\n- Registering commands on every bot startup\n- Registering in every guild separately\n- Making changes in a loop without delays\n\nRecommended fix:\n\n## Use a separate deploy script (not on startup)\n\n```javascript\n// deploy-commands.js - Run manually, not on bot start\nconst { REST, Routes } = require('discord.js');\n\nconst rest = new REST().setToken(process.env.DISCORD_TOKEN);\n\nasync function deploy() {\n  // For development: Guild commands (instant)\n  if (process.env.GUILD_ID) {\n    await rest.put(\n      Routes.applicationGuildCommands(\n        process.env.CLIENT_ID,\n        process.env.GUILD_ID\n      ),\n      { body: commands }\n    );\n    console.log('Guild commands deployed instantly');\n  }\n\n  // For production: Global commands (up to 1 hour)\n  else {\n    await rest.put(\n      Routes.applicationCommands(process.env.CLIENT_ID),\n      { body: commands }\n    );\n    console.log('Global commands deployed (may take up to 1 hour)');\n  }\n}\n\ndeploy();\n```\n\n```python\n# Pycord - Don't sync on every startup\n@bot.event\nasync def on_ready():\n    # DON'T DO THIS:\n    # await bot.sync_commands()\n\n    print(f\"Ready! Commands should already be registered.\")\n\n# Instead, sync manually or use a flag\nif __name__ == \"__main__\":\n    if \"--sync\" in sys.argv:\n        # Only sync when explicitly requested\n        bot.sync_commands_on_start = True\n    bot.run(token)\n```\n\n## Testing workflow\n\n1. Use guild commands during development (instant updates)\n2. Only deploy global commands when ready for production\n3. Run deploy script manually, not on every restart\n\n### Bot Token Exposed\n\nSeverity: CRITICAL\n\nSituation: Storing or sharing bot token\n\nSymptoms:\nUnauthorized actions from your bot.\nBot joins random servers.\nBot sends spam or malicious content.\n\"Invalid token\" after Discord invalidates it.\n\nWhy this breaks:\nYour bot token provides FULL control over your bot. Attackers can:\n- Send messages as your bot\n- Join servers, create invites\n- Access all data your bot can access\n- Potentially take over servers where bot has admin\n\nDiscord actively scans GitHub for exposed tokens and invalidates them.\nCommon exposure points:\n- Committed to Git\n- Shared in Discord itself\n- In client-side code\n- In public screenshots\n\nRecommended fix:\n\n## Never hardcode tokens\n\n```javascript\n// BAD - never do this\nconst token = 'MTIzNDU2Nzg5MDEyMzQ1Njc4.ABCDEF.xyz...';\n\n// GOOD - environment variables\nrequire('dotenv').config();\nclient.login(process.env.DISCORD_TOKEN);\n```\n\n## Use .gitignore\n\n```\n# .gitignore\n.env\n.env.local\nconfig.json\n```\n\n## If token is exposed\n\n1. Go to Developer Portal immediately\n2. Regenerate the token\n3. Update all deployments\n4. Review bot activity for unauthorized actions\n5. Check git history and force push to remove if needed\n\n## Use environment variables properly\n\n```bash\n# .env (never commit)\nDISCORD_TOKEN=your_token_here\nCLIENT_ID=your_client_id\n```\n\n```javascript\n// Load with dotenv\nrequire('dotenv').config();\nconst token = process.env.DISCORD_TOKEN;\n```\n\n### Bot Missing applications.commands Scope\n\nSeverity: HIGH\n\nSituation: Slash commands not appearing for users\n\nSymptoms:\nBot is in server but slash commands don't show up.\nTyping / shows no commands from your bot.\nCommands worked in development server but not others.\n\nWhy this breaks:\nDiscord has two important OAuth scopes:\n- `bot` - Traditional bot permissions (messages, reactions, etc.)\n- `applications.commands` - Slash command permissions\n\nMany bots were invited with only the `bot` scope before slash commands\nexisted. They need to be re-invited with both scopes.\n\nRecommended fix:\n\n## Generate correct invite URL\n\n```\nhttps://discord.com/api/oauth2/authorize\n  ?client_id=YOUR_CLIENT_ID\n  &permissions=0\n  &scope=bot%20applications.commands\n```\n\n## In Discord Developer Portal\n\n1. Go to OAuth2 > URL Generator\n2. Select BOTH:\n   - `bot`\n   - `applications.commands`\n3. Select required bot permissions\n4. Use generated URL\n\n## Re-invite without kicking\n\nUsers can use the new invite URL even if bot is already in server.\nThis adds the new scope without removing the bot.\n\n```javascript\n// Generate invite URL in code\nconst inviteUrl = client.generateInvite({\n  scopes: ['bot', 'applications.commands'],\n  permissions: [\n    'SendMessages',\n    'EmbedLinks',\n    // Add other needed permissions\n  ]\n});\n```\n\n### Global Commands Not Appearing Immediately\n\nSeverity: MEDIUM\n\nSituation: Deploying global slash commands\n\nSymptoms:\nCommands don't appear after deployment.\nGuild commands work but global commands don't.\nCommands appear after an hour.\n\nWhy this breaks:\nGlobal commands can take up to 1 hour to propagate to all Discord servers.\nThis is by design for Discord's caching and CDN.\n\nGuild commands are instant but only work in that specific guild.\n\nRecommended fix:\n\n## Development: Use guild commands\n\n```javascript\n// Instant updates for testing\nawait rest.put(\n  Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID),\n  { body: commands }\n);\n```\n\n## Production: Deploy global commands during off-peak\n\n```javascript\n// Takes up to 1 hour to propagate\nawait rest.put(\n  Routes.applicationCommands(CLIENT_ID),\n  { body: commands }\n);\n```\n\n## Workflow\n\n1. Develop and test with guild commands (instant)\n2. When ready, deploy global commands\n3. Wait up to 1 hour for propagation\n4. Don't deploy global commands frequently\n\n### Frequent Gateway Disconnections\n\nSeverity: MEDIUM\n\nSituation: Bot randomly goes offline or misses events\n\nSymptoms:\nBot shows as offline intermittently.\nEvents are missed (member joins, messages).\nReconnection messages in logs.\n\nWhy this breaks:\nDiscord gateway requires regular heartbeats. Issues:\n- Blocking operations prevent heartbeat\n- Network instability\n- Memory pressure causing GC pauses\n- Too many guilds without sharding (2500+ requires sharding)\n\nRecommended fix:\n\n## Never block the event loop\n\n```javascript\n// BAD - blocks event loop\nconst data = fs.readFileSync('file.json');\n\n// GOOD - async\nconst data = await fs.promises.readFile('file.json');\n```\n\n## Handle reconnections gracefully\n\n```javascript\nclient.on('shardResume', (id, replayedEvents) => {\n  console.log(`Shard ${id} resumed, replayed ${replayedEvents} events`);\n});\n\nclient.on('shardDisconnect', (event, id) => {\n  console.log(`Shard ${id} disconnected`);\n});\n\nclient.on('shardReconnecting', (id) => {\n  console.log(`Shard ${id} reconnecting...`);\n});\n```\n\n## Implement sharding at scale\n\n```javascript\n// Required at 2500+ guilds\nconst manager = new ShardingManager('./bot.js', {\n  token: process.env.DISCORD_TOKEN,\n  totalShards: 'auto'\n});\nmanager.spawn();\n```\n\n### Modal Must Be First Response\n\nSeverity: MEDIUM\n\nSituation: Showing a modal from a slash command or button\n\nSymptoms:\n\"Interaction has already been acknowledged\" error.\nModal doesn't appear.\nWorks sometimes but not others.\n\nWhy this breaks:\nModals have a special requirement: showing a modal MUST be the first\nresponse to an interaction. You cannot:\n- defer() then showModal()\n- reply() then showModal()\n- Think for more than 3 seconds then showModal()\n\nRecommended fix:\n\n## Show modal immediately\n\n```javascript\n// CORRECT - modal is first response\nasync execute(interaction) {\n  const modal = new ModalBuilder()\n    .setCustomId('my-modal')\n    .setTitle('Input Form');\n\n  // Show immediately - no defer, no reply first\n  await interaction.showModal(modal);\n}\n```\n\n```javascript\n// WRONG - deferred first\nasync execute(interaction) {\n  await interaction.deferReply();  // CAN'T DO THIS\n  await interaction.showModal(modal);  // Will fail\n}\n```\n\n## If you need to check something first\n\n```javascript\nasync execute(interaction) {\n  // Quick sync check is OK (under 3 seconds)\n  if (!hasPermission(interaction.user.id)) {\n    return interaction.reply({\n      content: 'No permission',\n      ephemeral: true\n    });\n  }\n\n  // Show modal (still first interaction response for this path)\n  await interaction.showModal(modal);\n}\n```\n\n## Validation Checks\n\n### Hardcoded Discord Token\n\nSeverity: ERROR\n\nDiscord tokens must never be hardcoded\n\nMessage: Hardcoded Discord token detected. Use environment variables.\n\n### Token Variable Assignment\n\nSeverity: ERROR\n\nTokens should come from environment, not strings\n\nMessage: Token assigned from string literal. Use environment variable.\n\n### Token in Client-Side Code\n\nSeverity: ERROR\n\nNever expose Discord tokens to browsers\n\nMessage: Discord credentials exposed client-side. Only use server-side.\n\n### Slow Operation Without Defer\n\nSeverity: WARNING\n\nSlow operations should be deferred to avoid timeout\n\nMessage: Slow operation without defer. Interaction may timeout.\n\n### Interaction Without Error Handling\n\nSeverity: WARNING\n\nInteractions should have try/catch for graceful errors\n\nMessage: Interaction without error handling. Add try/catch.\n\n### Using Message Content Intent\n\nSeverity: WARNING\n\nMessage Content is privileged, prefer slash commands\n\nMessage: Using Message Content intent. Consider slash commands instead.\n\n### Requesting All Intents\n\nSeverity: WARNING\n\nOnly request intents you actually need\n\nMessage: Requesting all intents. Only enable what you need.\n\n### Syncing Commands on Ready Event\n\nSeverity: WARNING\n\nDon't sync commands on every bot startup\n\nMessage: Syncing commands on startup. Use separate deploy script.\n\n### Registering Commands in Loop\n\nSeverity: WARNING\n\nUse bulk registration, not individual calls\n\nMessage: Registering commands in loop. Use bulk registration.\n\n### No Rate Limit Handling\n\nSeverity: INFO\n\nConsider handling rate limits for bulk operations\n\nMessage: Bulk operation without rate limit handling.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs AI-powered Discord bot -> llm-architect (Integrate LLM for conversational Discord bot)\n- user needs Slack integration too -> slack-bot-builder (Cross-platform bot architecture)\n- user needs voice features -> voice-agents (Discord voice channel integration)\n- user needs database for bot data -> postgres-wizard (Store user data, server configs, moderation logs)\n- user needs workflow automation -> workflow-automation (Discord events trigger workflows)\n- user needs high availability -> devops (Sharding, scaling, monitoring for large bots)\n- user needs payment integration -> stripe-specialist (Premium bot features, subscription management)\n\n## When to Use\nUse this skill when the request clearly matches the capabilities and patterns described above.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["discord","bot","architect","antigravity","awesome","skills","sickn33"],"capabilities":["skill","source-sickn33","category-antigravity-awesome-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/discord-bot-architect","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under sickn33/antigravity-awesome-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T11:40:47.878Z","embedding":null,"createdAt":"2026-04-18T20:34:53.909Z","updatedAt":"2026-04-25T11:40:47.878Z","lastSeenAt":"2026-04-25T11:40:47.878Z","tsv":"'-2500':2280 '-3':659 '/api/oauth2/authorize':3247 '/banner.png':1715 '/banner.png'')':1641 '/bot.js':2085,3595 '/cogs':650 '/developers/applications':2629 '0':1289,1864,1870,2140,2163,3254 '000':935 '1':437,896,1214,1293,1328,1952,2279,2564,2589,2619,2624,2768,2861,2879,2938,3095,3262,3370,3431,3443,3461 '1/1s':2037 '10':1657,1732,1809 '100':1015,1269,2606 '1000':597,721,1032,1281,1898,2238,2292 '1024':1759 '120':2024 '15':1422,1546,2401,2441 '2':1217,2571,2599,2630,2653,2946,3101,3268,3451 '200':1908,2762,2774 '20applications.commands':3257 '25':1343,1750 '2500':76,2050,2059,2285,3526,3589 '256':1742,1754 '2f':2239 '3':51,898,1372,1408,1542,2307,2355,2557,2577,2634,2955,3105,3273,3457,3666,3740 '4':2098,2639,3109,3278,3465 '40':1841,1888,1946 '4096':1746 '429':2734 '5':878,1320,1324,1335,1337,2645,3116 '5/5s':2034 '50':1845,2019 '60':934,936,1108,2027 '6000':1736 'acc':2159,2161 'access':3020,3026 'acknowledg':48,1469,2353,2398,2410,2471,3624 'across':1739 'action':2977,3115 'actionrow':1321,1327,1332 'actionrowbuild':810,838,883,1039,1043 'activ':2576,3036,3112 'actual':3905 'add':162,1847,1958,3302,3325,3872 'addcompon':839,884,1040,1044 'addfield':1617 'addopt':899 'admin':3034 'afterward':2396 'agent':4019 'ai':1518,1528,3986 'ai-pow':3985 'airespons':1431,1443,2448,2459 'alreadi':2907,3298,3622 'alway':53,2543 'antigrav':4 'api':1376,1771,1788,2374 'appear':2733,2745,3166,3332,3345,3357,3629 'applic':493,2329,2633 'applications.commands':3158,3212,3272,3321 'approach':2058 'architect':3,12,3992 'architectur':4012 'arg':248,250,254,256 'ask':4124 'assign':1785,3787,3799 'async':276,306,409,558,589,617,688,728,830,941,986,1116,1137,1157,1220,1282,1310,1401,1465,1496,1846,1859,1956,1975,2149,2168,2214,2242,2421,2464,2830,2891,3546,3681,3709,3731 'async/await':504 'asyncio':1933 'asyncio.create':1969 'asyncio.future':1962 'asyncio.sleep':2001 'attack':3009 'author':1681 'auto':2090,2211,3600 'auto-determin':2210 'autom':4043,4046 'automat':1795,1928,2198 'autoshardedbot':2191 'avail':4054 'avoid':170,541,2676,2691,2696,3844 'await':281,291,325,347,351,422,443,576,598,639,723,745,915,946,956,968,1052,1079,1124,1145,1165,1172,1182,1225,1295,1315,1410,1414,1428,1432,1439,1448,1467,1474,1480,1482,1504,1508,1514,1520,1524,1534,1650,1658,1727,1879,1892,1919,1973,1988,2000,2012,2154,2173,2430,2434,2445,2449,2456,2469,2473,2481,2484,2500,2509,2841,2864,2899,3410,3435,3549,3702,3712,3718,3761 'awesom':5 'backoff':67 'bad':3069,3537 'bash':3131 'basic':1593 'beyond':793 'block':3510,3532,3538 'bodi':429,448,1023,1074,1078,1089,1291,1303,2848,2869,3417,3440 'bodyinput':1017,1045 'bot':2,11,21,101,114,124,462,485,488,500,547,587,678,680,686,697,703,752,756,760,763,1602,1608,1669,1683,2048,2057,2069,2201,2391,2520,2595,2603,2637,2692,2786,2816,2964,2973,2980,2981,2985,3001,3008,3015,3024,3032,3111,3156,3170,3187,3205,3207,3217,3223,3256,3271,3276,3296,3309,3320,3478,3486,3929,3989,3998,4006,4011,4028,4061,4070 'bot.add':753 'bot.event':557,2213,2241,2890 'bot.guilds':1694,2265 'bot.js':2119 'bot.latency':596 'bot.load':654 'bot.run':660,2934 'bot.shards':2224 'bot.shards.items':2231 'bot.slash':581,609,1153,1306,1490,2462 'bot.sync':577,2900,2929 'bot.user':567 'bot.user.display_avatar.url':1687,1709 'bot.users':1703 'boundari':4132 'break':2346,2554,2754,2999,3198,3363,3503,3637 'broadcast':2164 'broadcastmessag':2170 'browser':3819 'build':16,112,123,498,797 'builder':1561,4007 'bulk':1781,1832,2035,3947,3958,3971,3974 'button':80,775,804,833,865,1094,1120,1141,1325,1460,2316,2359,2491,2705,3618 'buttonbuild':811,841,849,857 'buttonrow':836,922 'buttonstyl':812 'buttonstyle.danger':855 'buttonstyle.link':863 'buttonstyle.primary':847 'c':2175 'c.channels.cache.get':2180 'cach':3385 'call':1377,1521,1789,3951 'callback':1222,1284 'callllm':2450 'callopenai':1433 'cancel':851,853,955,959,1134,1139,1149 'cannot':1353,3655 'capabl':4086 'care':572 'catch':328,455,1446,1883 'category-antigravity-awesome-skills' 'caus':3518 'cdn':3387 'chang':1472,1558,2794 'channel':740,742,744,2033,2179,2183,4022 'channel.send':746,2184 'channelid':2171,2176,2181,2187 'charact':1737,1743,1747,1755,1760 'check':586,3117,3727,3736,3765 'choos':918 'clarif':4126 'class':672,1099,1188,1235,1247,1834,1938 'clear':4083,4099 'click':2360 'client':131,151,157,159,425,2124,2128,2130,2660,2665,2667,3057,3140,3143,3248,3251,3413,3438,3809,3825 'client-sid':3056,3808,3824 'client.commands':175 'client.commands.set':212 'client.generateinvite':3318 'client.guilds.cache.size':1621,2143 'client.login':257,3082 'client.on':252,2135,3556,3567,3575 'client.once':246 'client.shard.broadcasteval':2174 'client.shard.fetchclientvalues':2155 'client.shard.ids':2139 'client.user.displayavatarurl':1611,1637 'client.users.cache.size':1627 'cmd':1160 'code':2604,2656,3059,3315,3811 'cog':645,657,754,765 'cogs/general.py':665 'collabor':3980 'collect':132,177,790,924,940,1464,1935 'collector':927 'collector.on':939,1463 'collector.stop':951,961 'color':704,1590,1676 'colors.blue':1600 'come':3792 'command':31,40,89,108,174,182,202,208,211,214,313,317,320,341,375,380,395,414,416,430,432,449,454,469,472,474,494,509,520,549,554,569,578,580,582,606,610,671,682,766,795,1154,1307,1491,2197,2203,2315,2333,2358,2366,2463,2467,2585,2704,2720,2729,2731,2744,2755,2761,2773,2783,2836,2849,2852,2858,2870,2873,2901,2905,2930,2941,2950,3164,3176,3184,3188,3214,3227,3330,3340,3342,3349,3353,3356,3365,3389,3404,3418,3422,3441,3449,3456,3470,3616,3886,3894,3917,3926,3933,3941,3954 'command.data.name':213 'command.data.tojson':401 'command.execute':326 'commandfil':184,195,382,393 'commands.autoshardedbot':2202 'commands.bot':548,2693 'commands.cog':674 'commands.cog.listener':727 'commands.length':413 'commands.push':400 'commands.slash':681 'commandspath':179,186,199,377,384,398 'commit':3048,3134 'common':2780,3045 'communiti':911,913 'complet':1425,2343 'complex':126 'compon':33,79,772,921,950,960,1459,2490 'config':149,373,3081,3151,4037 'config.json':3090 'configur':528,2516 'confirm':799,843,845,945,949,1113,1118,1128,1156,1159 'confirmview':1100,1164 'connect':120 'consid':3892,3966 'console.error':318,330,457 'console.log':411,450,1816,1823,1826,2102,2108,2114,2137,2850,2871,3560,3571,3578 'const':130,137,142,156,178,183,192,196,201,217,222,231,235,240,262,279,287,299,312,332,356,361,366,374,376,381,390,394,402,420,441,808,835,880,926,989,1000,1016,1067,1073,1426,1430,1478,1588,1595,1800,1804,1871,1877,1902,1915,2077,2081,2123,2127,2152,2178,2443,2447,2659,2664,2818,2823,3073,3152,3316,3541,3547,3591,3684 'constructor':1836 'content':45,283,334,538,917,948,958,970,1081,1127,1148,1441,1450,1484,1570,2527,2546,2579,2688,2698,2718,2990,3747,3876,3881,3890 'context':2186,2364 'control':3005 'convers':3996 'coro':1960,1964,1983,1989 'correct':2395,3242,3676 'count':2094,2160,2162,2208 'cover':22 'creat':150,3018 'creates/day':2763,2775 'credenti':3822 'criteria':4135 'critic':2311,2518,2968 'cross':2146,4009 'cross-platform':4008 'cross-shard':2145 'ctx':592,620,692,1161,1313,1500,2468 'ctx.author.display_avatar.url':1724 'ctx.defer':1505,1509,2470,2474 'ctx.followup.send':1183,1525,1535,2485 'ctx.respond':599,640,724,1166,1728 'ctx.send':1316 'current':1613,1672 'custom':631,1798,1930 'data':206,267,421,442,820,978,1389,1582,2148,2523,3022,3542,3548,4029,4035 'data.length':453 'databas':1374,1516,2373,4026 'def':559,590,618,675,689,729,750,1102,1117,1138,1158,1191,1221,1238,1250,1283,1311,1497,1940,1957,1976,2215,2243,2465,2892 'defer':1354,1356,1386,1404,1437,1488,1502,1544,2416,2424,2454,3656,3698,3707,3835,3842,3850 'delay':2799 'deleg':3981 'delet':2036 'deploy':91,2737,2805,2832,2853,2874,2881,2948,2957,3108,3337,3347,3420,3454,3468,3938 'deploy-commands.js':468,2811 'deprec':47,2583 'dequ':1937,1948 'describ':1034,4089,4103 'descript':585,613,685,699,1671,1749 'design':906,908,1203,1205,3381 'detect':3781 'determin':2092,2212 'dev':903,1199 'develop':901,1197,2593,2622,2834,2943,3098,3191,3260,3401,3444 'devop':4055 'dirnam':181,220,379 'disconnect':2113,2117,3474,3574 'discord':1,10,20,100,113,461,487,499,516,662,667,702,759,1098,1770,2091,2193,2290,2347,2384,2555,2592,2610,2994,3035,3053,3135,3199,3259,3376,3383,3504,3767,3771,3779,3816,3821,3988,3997,4020,4047 'discord-bot':460,758 'discord.applicationcontext':593,621,693,1162,1314,1501 'discord.buttonstyle.green':1115 'discord.buttonstyle.red':1136 'discord.color.blue':705,1677 'discord.com':2628,3246 'discord.com/api/oauth2/authorize':3245 'discord.com/developers/applications':2627 'discord.embed':695,1667 'discord.ext':518,669,2195 'discord.inputtextstyle.long':1276 'discord.inputtextstyle.short':1264 'discord.intents.default':536,2206,2680 'discord.js':23,96,104,136,265,302,360,803,818,1385,1592,1791,1803,2071,2080,2126,2415,2658,2663,2822 'discord.js.org':861 'discord.member':624,735 'discord.option':623,629 'discord.selectoption':1195,1201 'discord.ui.button':1111,1132 'discord.ui.inputtext':1260,1272 'discord.ui.modal':1249 'discord.ui.select':1190 'discord.ui.view':1101,1237 'discord.utils.utcnow':1726 'display':1574 'document':859 'doesn':2537,3627 'dotenv':148,372,522,525,527,3080,3148,3150 'e':1533,1996,1999 'edg':575,2304 'edit':1435,2452 'els':251,350,952,962,2863 'emb':694,725,726,1444,1560,1594,1596,1652,1653,1655,1660,1666,1729,1730,1733,1741,1753 'embed':1564 'embed.add':706,713,1688,1697 'embed.set':1680,1706,1710,1716 'embed.timestamp':1725 'embed1':1661 'embed2':1662 'embed3':1663 'embedbuild':1589,1598 'embedlink':3324 'emit':868 'emoji':904,909,914,1200,1206 'empti':2533,2550 'enabl':531,2563,2590,2620,3912 'entri':466,2076 'env':482,769,3088,3132 'env.local':3089 'environ':3077,3128,3783,3794,3804,4115 'environment-specif':4114 'ephemer':342,1090,1233,1304,1413,1416,1476,1507,1510,1548,2433,2436,2475,2511,3750 'error':329,331,338,456,458,1447,1452,1537,1884,1886,2387,2735,3625,3770,3789,3813,3856,3866,3870 'etc':3211 'even':2388,3294 'event':122,134,216,221,241,300,477,478,869,3484,3491,3534,3539,3566,3569,3920,4048 'event.execute':249,255 'event.name':247,253 'event.once':245 'eventfil':223,234 'events.interactioncreate':305 'eventspath':218,225,238 'everi':2785,2790,2888,2962,3928 'example.com':1605,1640,1679,1714 'example.com/banner.png':1713 'example.com/banner.png'')':1639 'except':1530,1531,1993,1994,1998 'execut':209,277,307,339,831,987,1402,2422,3682,3710,3732 'exist':3228 'expert':4120 'explicit':2927 'exponenti':66 'expos':2966,3040,3094,3815,3823 'exposur':3046 'extens':655 'f':188,227,386,563,600,641,656,718,747,1228,1298,1526,2219,2233,2250,2270,2486,2903 'f.endswith':189,228,387 'fail':2326,2337,3722 'fals':634,1144,1839,1901,1950,2004 'featur':4016,4071 'feedback':982,985,995,999,1006,1022,1026,1036,1065,1071,1077,1085,1257,1274,1309,1312 'feedback-bodi':1021,1076 'feedback-mod':994,1064 'feedback-titl':1005,1070 'feedbackmod':1248,1318 'fetchrepli':285 'field':707,714,1585,1689,1698,1751,1757,1762 'file':193,200,232,239,391,399,764,1380,2375 'file.json':3544,3551 'filenam':647,658 'filename.endswith':652 'filepath':197,204,236,243 'filter':187,226,385,929 'fire':2539 'first':90,1050,1351,1355,3605,3649,3679,3701,3708,3729,3755 'fix':2409,2617,2801,3064,3240,3400,3530,3671 'flag':2916 'follow':2405 'follow-up':2404 'followup':1545 'footer':1717 'forc':3121 'form':801,976,3694 'format':1575 'formatuptim':1633 'foundat':98,486 'frequent':3471,3472 'fs':138,141,362,365 'fs.promises.readfile':3550 'fs.readdirsync':185,224,383 'fs.readfilesync':3543 'full':118,3004 'function':2150,2169,2831 'futur':1961,1965,1974,1984 'future.set':1990,1997 'gateway':28,119,2023,2597,2643,3473,3505 'gatewayintentbit':133,2661 'gatewayintentbits.guildmembers':2670 'gatewayintentbits.guildmessages':167 'gatewayintentbits.guildpresences':2672 'gatewayintentbits.guilds':161,2669 'gatewayintentbits.messagecontent':168,2674 'gc':3519 'general':673,755 'general.py':768 'generat':1383,3241,3267,3280,3311 'get':2132,2256 'gettotalguild':2151 'git':3050,3118 'github':3038 'gitignor':3086,3087 'global':92,431,1827,2018,2760,2857,2872,2949,3329,3338,3352,3364,3421,3455,3469 'go':2625,2635,3096,3263 'goe':3480 'good':507,3076,3545 'grace':64,1768,3554,3865 'greet':612,614,619,627 'group':767 'guid':2278 'guild':77,88,415,427,2038,2043,2060,2144,2257,2263,2275,2276,2281,2286,2293,2565,2572,2748,2772,2777,2791,2835,2851,2940,3348,3388,3398,3403,3415,3448,3523,3590 'guild.members':2011 'guilds.cache.size':2156 'handl':61,1055,1359,1766,1769,1792,1799,1925,1931,2199,2313,3552,3857,3871,3963,3967,3979 'handler':475,479 'hardcod':3066,3766,3776,3778 'haspermiss':3743 'heartbeat':3508,3513 'hello':638 'help':701,1579 'high':1778,2725,3161,4053 'high-volum':1777 'histori':3119 'hit':1911 'horizont':2063 'hour':438,2769,2862,2880,3360,3371,3432,3462 'i.customid':944,954,964 'i.deferreply':1475 'i.deferupdate':1468 'i.editreply':1483 'i.update':947,957,969 'i.user.id':931 'i.values.join':973 'i/o':2376 'icon':1685,1722 'iconurl':1610,1648 'id':426,428,447,2228,2236,2248,2253,2262,2273,2840,2845,2847,2868,3141,3144,3249,3252,3414,3416,3439,3558,3562,3570,3573,3577,3580 'imag':1586,1711 'immedi':1405,1503,2411,2425,2472,3100,3333,3674,3696 'implement':3582 'import':513,515,519,523,666,670,1097,1932,1936,2192,2196,3202 'index.js':464 'individu':3950 'info':684,690,698,1815,2134,3965 'info.global':1828 'info.retryafter':1821 'info.route':1825 'inform':687,1576 'init':676,1103,1106,1192,1208,1239,1242,1251,1254,1941 'initi':1540,1555 'inlin':1622,1628,1634,1695,1704 'input':792,3693,4129 'instabl':3515 'instant':417,2778,2837,2854,2944,3391,3406,3450 'instead':2708,2910,3895 'integr':3993,4002,4023,4065 'intent':29,46,57,60,155,160,529,535,555,556,738,2131,2205,2515,2530,2541,2547,2559,2598,2644,2649,2668,2679,2694,2695,2699,2719,3877,3891,3898,3903,3910 'intents.members':544,2681 'intents.message':537,2687 'intents.presences':2684 'interact':32,49,127,278,308,327,771,787,828,832,988,1121,1142,1177,1224,1286,1403,2305,2325,2350,2423,3620,3653,3683,3711,3733,3756,3851,3854,3860,3868 'interaction.channel.createmessagecomponentcollector':928 'interaction.client.commands.get':314 'interaction.commandname':315,322 'interaction.createdtimestamp':290 'interaction.customid':1063 'interaction.deferred':346 'interaction.deferreply':1411,1415,2431,2435,2510,3713 'interaction.deferupdate':2501 'interaction.editreply':292,1440,1449,2457 'interaction.fields.gettextinputvalue':1069,1075 'interaction.followup':348 'interaction.ischatinputcommand':310 'interaction.ismodalsubmit':1061 'interaction.replied':345 'interaction.reply':282,352,916,1080,1651,1659,3746 'interaction.response.edit':1125,1146 'interaction.response.send':1226,1296 'interaction.showmodal':1053,3703,3719,3762 'interaction.user.displayavatarurl':1649 'interaction.user.id':932,3744 'interactioncr':1059 'interactioncreate.js':481 'interfac':789 'intermitt':3490 'invalid':2991,2995,3043 'invit':3019,3219,3235,3243,3284,3292,3312 'inviteurl':3317 'issu':3509 'item':1244,1259,1271,2268 'javascript':24,128,260,297,354,802,974,1384,1587,1790,2070,2414,2493,2657,2810,3068,3145,3310,3405,3427,3536,3555,3586,3675,3705,3730 'javascript/typescript':116 'join':732,1231,2536,2982,3016,3495 'join/leave':2568 'js':190,229,388 'keep':2613 'kick':3286 'label':900,905,910,1112,1133,1196,1202,1261,1273 'larg':2068,4060 'latenc':288,294,295,588,594,602,603,716 'later':1559,2413 'launch':2103 'legaci':551 'len':711,1693,1702,2223,2274 'length':1268,1280 'limit':35,63,1319,1731,1765,1773,1794,1818,1913,1927,2017,2723,2742,2759,3962,3969,3978,4091 'link':864 'list':2532,2570 'liter':3802 'll':2380 'llm':1378,3991,3994 'llm-architect':3990 'load':173,215,524,526,644,3146 'local':2335 'log':564,1581,2220,3500,4039 'look':1569 'loop':2797,3535,3540,3943,3956 'main':465,762,2075,2919 'main.py':512,761 'make':2793 'malici':2989 'manag':2073,2082,3592,4073 'manager.on':2099 'manager.spawn':2118,3601 'mani':3216,3522 'manual':2562,2813,2912,2959 'margin':1843 'match':321,4084,4100 'max':1215,1267,1279,1340,1656 'may':2875,3852 'medium':3335,3476,3608 'member':731,734,737,2009,2039,2522,2529,2531,2535,2566,2567,2569,3494 'member.guild.system':741 'member.mention':749 'member.send':2014 'memori':2065,2296,3516 'menu':824,829,871,1187,1330,1347,2362,2365 'menus':777,798,807,1339,1462,1580,2318,2492 'messag':42,44,628,632,636,1126,1147,1227,1297,1342,1565,1735,1782,1909,2030,2172,2177,2185,2188,2499,2526,2545,2578,2581,2697,2710,2717,2743,3012,3209,3496,3498,3777,3797,3820,3846,3867,3875,3880,3887,3889,3907,3931,3952,3973 'message.content':2548 'message/modal':1323 'min':1212 'minim':58,153 'minut':1423,1547,2402,2442 'miss':2381,2513,3157,3483,3493,4137 'mistak':2781 'modal':82,779,975,990,996,1047,1054,1056,1066,1246,1317,1348,2320,2707,3602,3612,3626,3638,3645,3673,3677,3685,3691,3704,3720,3753,3763 'modal.addcomponents':1037 'modalbuild':814,992,3687 'moder':4038 'modern':99 'modifi':2120 'module.exports':266,303,819,977,1388,2420 'monitor':4058 'ms':296,604,722,1822,2240 'msg':635,643 'mtizndu2nzg5mdeymzq1njc4.abcdef.xyz':3075 'multipl':1654 'must':1048,1349,2587,3603,3646,3773 'my-mod':3689 'n':1086,1088,1300,1302 'name':304,583,611,683,708,715,1155,1308,1492,1607,1609,1618,1624,1630,1682,1684,1690,1699,1758,2918 'need':117,166,506,534,786,2521,2609,2651,3126,3230,3327,3725,3906,3915,3984,4000,4014,4025,4041,4052,4063 'network':3514 'never':2342,3065,3070,3133,3531,3774,3814 'new':158,176,268,404,821,837,840,848,856,882,885,979,991,1002,1018,1038,1042,1390,1597,1806,1850,1893,1904,2083,2129,2507,2666,2825,3291,3304,3593,3686 'node':140,145,364,369 'none':1110,1130,1151,1181,2209 'note':1549 'oauth':3203 'oauth2':3265 'occur':1453,1538 'off-peak':3424 'offlin':3481,3489 'ok':3738 'one':873 'onlin':2574 'openai':1522 'oper':1361,1368,1400,1780,1833,1848,1855,1872,1880,2341,2372,2419,2429,2483,3511,3833,3839,3848,3972,3975 'optim':2066,2093 'option':608,796,920,1194,1218,1219,1344 'os':514 'os.environ':661 'os.listdir':649 'other':2751,3195,3634 'output':4109 'package.json':483 'pars':43,2711 'path':143,146,367,370,3760 'path.join':180,198,219,237,378,397 'pattern':95,505,773,1358,1562,1767,1830,2046,4088 'paus':3520 'payment':4064 'peak':3426 'per':874,1322,1326,1331,1341,1345,1734,1752,1756,1761,1890,1944,1954,2021,2026,2258,2294,2776 'perform':1397 'permiss':3208,3215,3253,3277,3322,3328,3749,4130 'ping':271,284,584,591 'ping.js':476 'placehold':1209 'plan':68 'platform':4010 'point':467,3047 'pong':275,293,601 'portal':2594,2623,3099,3261 'possibl':172,543,2701 'postgr':4031 'postgres-wizard':4030 'potenti':3027 'power':3987 'prefer':503,552,3884 'prefix':550,2204 'premium':4069 'presenc':2524,2540,2573 'pressur':3517 'prevent':3512 'principl':38 'print':562,2218,2232,2249,2269,2902 'privat':2478 'privileg':59,169,540,546,739,2514,2558,2596,2642,2671,2673,2675,2683,2686,2690,3883 'process':1381,1455,1860,1977,2302,2392,2412 'process.env.client':446,2844,2867 'process.env.discord':258,407,1811,2087,2828,3083,3154,3597 'process.env.guild':2839,2846 'product':18,2339,2856,2954,3419 'production-readi':17 'profession':1568 'professional-look':1567 'promis':1851,1894 'propag':440,2771,3373,3434,3464 'proper':3130 'provid':3003 'public':3061 'push':3122 'py':653 'pycord':26,484,490,1093,1487,1665,2190,2461,2678,2883 'pycord/discord.py':1924 'python':27,491,502,511,664,1092,1486,1664,1923,2189,2460,2677,2882 'queri':1375,1517 'queue':1829,1903,2005 'queue.add':1920,2013 'quick':3734 'r':1895,1897 'random':2983,3479 'rate':34,62,1764,1772,1793,1817,1912,1926,2016,2722,2741,2758,3961,3968,3977 'ratelimit':1814 'ratelimitqueu':1835,1905,1939,2006 're':2496,2504,3234,3283 're-invit':3233,3282 'reaction':3210 'read':2580 'readi':19,94,561,2107,2111,2136,2141,2217,2246,2255,2894,2904,2952,3453,3919 'ready.js':480 'recommend':2291,2408,2616,2800,3063,3239,3399,3529,3670 'reconnect':3497,3553,3581 'refresh':412 'regener':3102 'regist':452,2727,2782,2788,2909,3940,3953 'registr':470,2721,2756,3948,3959 'regular':3507 'reject':1853,1857,1874,1885 'remov':3124,3307 'repeat':1787 'replay':3564 'replayedev':3559,3565 'repli':273,333,349,353,1438,2455,3659,3700 'request':54,1457,1645,1719,1889,1943,1953,2020,2025,2040,2394,2600,2654,2928,3896,3902,3908,4082 'requir':56,74,135,139,144,147,154,203,242,264,301,359,363,368,371,396,633,736,817,1265,1277,1591,1802,2061,2079,2125,2284,2288,2348,2561,2662,2715,2821,3079,3149,3275,3506,3527,3587,3642,4128 'requirements.txt':770 'resolv':1852,1856,1873,1881 'respond':2332,2378 'respons':925,1051,1352,1357,1379,1387,1489,1519,1529,1541,1556,2407,2479,2508,3606,3650,3680,3757 'rest':357,403,405,1801,1805,1807,2819,2824,2826 'rest.on':1813 'rest.put':423,444,2842,2865,3411,3436 'restart':2963 'result':1427,1434,1442,1479,1485,1513,1523,1527,1878,1882,1987,1991,1992,2153,2444,2451,2458,2480,2487,2488 'resultemb':1445 'results.reduce':2158 'resum':3563 'retri':1819 'return':311,323,1849,1865,1972,2157,3745 'review':3110,4121 'rich':84,781,1563 'role':890,894,967,1211,1784 'roleselect':1189,1245 'roleview':1236 'round':595,719 'rout':358,1824,2820 'routes.applicationcommands':445,2866,3437 'routes.applicationguildcommands':424,2843,3412 'row':834,872,875 'rule':2309 'run':2299,2812,2956 'safe':1842 'safeti':4131 'scale':2047,2064,2277,3585,4057 'scan':3037 'scope':3159,3204,3224,3238,3255,3305,3319,4102 'screenshot':3062 'script':471,2806,2958,3939 'scroll':2640 'second':52,937,1373,1409,1543,1891,1945,1955,2022,2028,2308,2356,3667,3741 'section':2638 'see':573,2323 'select':81,776,806,870,889,892,966,972,1186,1210,1230,1329,1338,1346,1461,2317,2361,2363,2631,3269,3274 'select-rol':888,965 'selectrow':881,923 'self':677,691,733,1104,1119,1140,1193,1223,1240,1252,1285,1942,1959,1978 'self._process':1971 'self.add':1243,1258,1270 'self.bot':679 'self.bot.guilds':712 'self.bot.latency':720 'self.children':1288,1292 'self.delay':1951,2002 'self.processing':1949,1968,1979,2003 'self.queue':1947,1982 'self.queue.append':1963 'self.queue.popleft':1985 'self.stop':1131,1152 'self.value':1109,1122,1143 'self.values':1232 'send':1907,2505,2986,3011 'sendmessag':3323 'sent':280 'sent.createdtimestamp':289 'separ':2301,2792,2804,3937 'server':709,1619,1691,2051,2607,2984,3017,3030,3173,3192,3300,3377,3830,4036 'server-sid':3829 'set':1553 'setauthor':1606 'setcolor':1599 'setcustomid':842,850,887,993,1004,1020,3688 'setdescript':272,825,983,1396,1612 'setfoot':1643 'setimag':1638 'setlabel':844,852,858,1008,1024 'setmaxlength':1014,1031 'setmaxvalu':897 'setminvalu':895 'setnam':270,823,981,1392 'setplacehold':891,1033 'setrequir':1012,1029 'setstyl':846,854,862,1010,1027 'setthumbnail':1636 'settimeout':1896 'settimestamp':1642 'settitl':997,1601,3692 'settoken':406,1810,2827 'setup':102,751 'seturl':860,1604 'sever':2310,2517,2724,2967,3160,3334,3475,3607,3769,3788,3812,3836,3858,3878,3899,3921,3944,3964 'shard':37,70,2045,2053,2072,2101,2104,2109,2115,2122,2133,2138,2147,2167,2200,2207,2225,2227,2229,2234,2235,2245,2247,2251,2252,2259,2261,2267,2271,2272,2283,2287,2295,2298,3525,3528,3561,3572,3579,3583,4056 'shard.id':2105,2110,2116 'shard.js':2074 'shard.latency':2237 'shard.on':2106,2112 'shardcreat':2100 'sharddisconnect':3568 'shardingmanag':2078,2084,3594 'shardreconnect':3576 'shardresum':3557 'share':2972,3051 'sharp':574,2303 'show':826,1046,2385,3179,3182,3487,3610,3643,3672,3695,3752 'showmod':3658,3661,3669 'sickn33':9 'side':3058,3810,3826,3831 'situat':2312,2519,2726,2969,3162,3336,3477,3609 'size':2044 'skill':6,7,14,4079,4094 'slack':4001,4005 'slack-bot-build':4004 'slash':30,39,107,473,508,553,579,605,794,2314,2357,2703,2728,3163,3175,3213,3226,3339,3615,3885,3893 'slashcommandbuild':263,269,809,822,980,1391 'slot':879,1336 'slow':1360,1394,1399,1494,1498,1515,2340,2371,2418,2428,2466,2482,3832,3838,3847 'slow-task':1393,1493 'slowdatabasequeri':1429,2446 'slowoper':1481 'someth':3728 'sometim':3631 'source-sickn33' 'spam':2987 'special':13,3641 'specialist':4068 'specif':2029,3397,4116 'specifi':2096 'src':463 'src/commands/ping.js':261 'src/deploy-commands.js':355 'src/events/interactioncreate.js':298 'src/index.js':129 'start':73,2817,2932 'startup':2787,2809,2889,3930,3935 'statist':1616,1675 'status':1577,1603,1614,1670,1673,2542,2575 'step':2618,2652 'still':3754 'stop':4122 'store':2970,4033 'str':630 'string':2551,3796,3801 'stringselectmenubuild':813,886 'stripe':4067 'stripe-specialist':4066 'structur':459,757,1584 'style':1114,1135,1263,1275 'submiss':1057 'submit':984,998,1256 'subscript':4072 'substitut':4112 'success':451,4134 'super':1105,1207,1241,1253 'support':510 'sure':1169 'symptom':2321,2528,2730,2975,3169,3341,3485,3619 'sync':568,2886,2911,2921,2925,3735,3916,3925,3932 'sys.argv':2923 'take':434,876,1333,1369,2765,2876,3028,3367,3428 'task':1395,1495,1499,1970,4098 'test':86,419,2936,3409,3446,4118 'text':1644,1718,2582 'textinputbuild':815,1003,1019 'textinputstyl':816 'textinputstyle.paragraph':1028 'textinputstyle.short':1011 'thank':1082,1299 'think':3662 'this.process':1858 'this.processing':1838,1862,1866,1900 'this.queue':1837 'this.queue.length':1863,1869 'this.queue.push':1854 'this.queue.shift':1875 'this.requestspersecond':1840,1899 'throttl':1887 'thumbnail':1707 'time':933,1184,1363,1539 'timeout':938,1107,2306,3845,3853 'titl':696,1007,1009,1068,1072,1087,1255,1262,1287,1301,1668,1745 'titleinput':1001,1041 'toggl':2646 'token':259,408,663,1812,2086,2088,2829,2935,2965,2974,2992,3002,3041,3067,3074,3084,3092,3104,3136,3138,3153,3155,3596,3598,3768,3772,3780,3785,3790,3798,3806,3817 'total':1738 'totalshard':2089,2097,3599 'tradit':3206 'treat':4107 'tri':324,410,1418,1512,1876,1986 'trigger':3982,4049 'true':286,343,539,545,1013,1030,1091,1123,1234,1266,1278,1305,1417,1477,1511,1623,1629,1635,1696,1705,1867,1980,2437,2476,2512,2682,2685,2689,2933,3751 'try/catch':3863,3873 'two':3201 'type':3181 'unauthor':2976,3114 'unknown/offline':2544 'updat':1578,2497,2764,2779,2945,3106,3407 'uptim':1631 'url':1678,1686,1708,1712,1723,3244,3266,3281,3293,3313 'usag':1906,2007 'use':78,111,497,774,785,1367,1573,1776,2056,2614,2702,2802,2914,2939,3085,3127,3279,3289,3402,3782,3803,3828,3874,3888,3936,3946,3957,4076,4077,4092 'user':616,622,625,788,791,1176,1625,1647,1700,1721,1916,1918,2322,3168,3287,3983,3999,4013,4024,4034,4040,4051,4062 'user.mention':642 'user.send':1921 'ux':85,782 'v14':97,105 'valid':3764,4117 'valu':710,717,902,907,912,1198,1204,1213,1216,1290,1294,1620,1626,1632,1692,1701,1763 'vari':2041 'variabl':3078,3129,3784,3786,3805 'verif':2611 'version':1808 'view':1096,1129,1150,1163,1170,1171 'view.value':1179 'view.wait':1173 'visual':1471 'voic':4015,4018,4021 'voice-ag':4017 'volum':1779 'wait':1174,3458 'want':2062 'warn':3837,3859,3879,3900,3922,3945 'welcom':748,1922,2015 'window':2383 'within':50,2354 'without':1362,1470,1910,2798,3285,3306,3524,3834,3849,3855,3869,3976 'wizard':4032 'work':2334,3189,3350,3394,3630 'workflow':2937,3442,4042,4045,4050 'workflow-autom':4044 'wrong':3706","prices":[{"id":"bd61ee80-b2bf-4a40-a81e-a3977a817eb2","listingId":"53428ea7-14e4-4b3f-b927-af5ad6442bc0","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:34:53.909Z"}],"sources":[{"listingId":"53428ea7-14e4-4b3f-b927-af5ad6442bc0","source":"github","sourceId":"sickn33/antigravity-awesome-skills/discord-bot-architect","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/discord-bot-architect","isPrimary":false,"firstSeenAt":"2026-04-18T21:36:08.356Z","lastSeenAt":"2026-04-25T06:51:00.774Z"},{"listingId":"53428ea7-14e4-4b3f-b927-af5ad6442bc0","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/discord-bot-architect","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/discord-bot-architect","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:53.909Z","lastSeenAt":"2026-04-25T11:40:47.878Z"}],"details":{"listingId":"53428ea7-14e4-4b3f-b927-af5ad6442bc0","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"discord-bot-architect","source":"skills_sh","category":"antigravity-awesome-skills","skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/discord-bot-architect"},"updatedAt":"2026-04-25T11:40:47.878Z"}}