/discord-interactions-js

JS/Node helpers for Discord Interactions

Primary LanguageTypeScriptMIT LicenseMIT

discord-interactions

version ci Downloads

Types and helper functions that may come in handy when you implement a Discord Interactions webhook.

Installation

npm install discord-interactions

Usage

Use the InteractionType and InteractionResponseType enums to figure out how to respond to a webhook.

Use verifyKey to check a request signature:

 const signature = req.get('X-Signature-Ed25519');
 const timestamp = req.get('X-Signature-Timestamp');
 const isValidRequest = verifyKey(req.rawBody, signature, timestamp, 'MY_CLIENT_PUBLIC_KEY');
 if (!isValidRequest) {
   return res.status(401).end('Bad request signature');
 }

Note that req.rawBody must be populated by a middleware (it is also set by some cloud function providers).

If you're using an express-like API, you can simplify things by using the verifyKeyMiddleware. For example:

app.post('/interactions', verifyKeyMiddleware('MY_CLIENT_PUBLIC_KEY'), (req, res) => {
  const message = req.body;
  if (message.type === InteractionType.APPLICATION_COMMAND) {
    res.send({
      type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
      data: {
        content: 'Hello world',
      },
    });
  }
});

Make sure that you do not use other middlewares like body-parser, which tamper with the request body, for interaction routes.

Exports

This module exports the following:

InteractionType

An enum of interaction types that can be POSTed to your webhook endpoint.

InteractionResponseType

An enum of response types you may provide in reply to Discord's webhook.

InteractionResponseFlags

An enum of flags you can set on your response data.

MessageComponentTypes

An enum of message component types that can be used in messages and modals.

Message components

Types for the different message component structures: Button, ActionRow, StringSelect, and InputText.

Also includes the enums ButtonStyleTypes and TextStyleTypes, and a StringSelectOption type.

verifyKey(rawBody: Buffer, signature: string, timestamp: string, clientPublicKey: string): Promise<boolean>

Verify a signed payload POSTed to your webhook endpoint.

verifyKeyMiddleware(clientPublicKey: string)

Express-style middleware that will verify request signatures (make sure you include this before any other middleware that modifies the request body).