Skip to content

Latest commit

 

History

History
executable file
·
1693 lines (1592 loc) · 169 KB

README.md

File metadata and controls

executable file
·
1693 lines (1592 loc) · 169 KB

Discord Stonker Bot

GitHub Releases GitHub Top Languages GitHub License Become a GitHub Sponsor Donate via PayPal

An advanced business-ready bot built for finance-related Discord servers. This bot adds a suite of features designed to enhance the experience of your server such as content organization, impersonator detection, bumping threads, and more.

To use this Discord bot, you would need to:

  1. Install the dependencies
  2. Configure the Discord application
  3. Configure the Twitter application (optional)
  4. Configure the Stonker Bot
  5. Start the bot using npm start

Install Dependencies

Before configuring and starting the bot, make sure to install the dependencies and required packages.

  1. Install Homebrew and run brew install node
  2. Tap into the bot directory with cd discord-stonker-bot
  3. Install dependencies by running npm install

Configure Discord Application

Here are the instructions on how you can create an application and connect this bot to your Discord server. Simply follow the directions below:

  1. First go to the Discord Developer Portal
  2. In the top right corner, click New Application
  3. Under the Name field, type "Stonker Bot"
    • If applicable, select a team under the Team dropdown
  4. Click Create to create the application
  5. Once the application is created, click the Bot menu item on the left
  6. Click Add Bot in the top right corner and then click Yes, do it!
  7. Under Privileged Gateway Intents, turn on these options:
    • PRESENCE INTENT
    • SERVER MEMBERS INTENT
    • MESSAGE CONTENT INTENT
  8. Click the General Information menu item
  9. Under Application ID, click Copy
  10. Replace the APP_ID_HERE below with the application ID you just copied then visit that link to add the bot into your server:
    • https://discord.com/oauth2/authorize?client_id=APP_ID_HERE&scope=bot&permissions=292348488773

Configure Twitter Application

Here are the instructions on how you can create an application and enable Twitter features on this bot. Simply follow the directions below:

  1. First go to Twitter Developers
  2. In the middle, click + Create Project
  3. Under the Project name field, type "Stonker", then click Next
  4. Under the Select a use case field, select "Build customized solutions in-house", then click Next
  5. Under the Project description field, type "For use with Stonker projects", then click Next
  6. Under the App name field, type "Stonker Bot", then click Next
  7. Click App settings
  8. Under User authentication settings, click Set up
  9. Enable the OAuth 1.0a section
  10. Under OAUTH 1.0A SETTINGS > App permissions, select Read and write
  11. Under Callback URI / Redirect URL, type "http://localhost"
  12. Under Website URL, type in "http://www.example.com"
  13. Click Save and then click Yes

Bot Configuration

In the project folder, you will find a config-sample.json file. Each section enables a feature and must be configured correctly. If you wish to disable a feature, you may omit the section from the configuration.

Note: It is recommended that you configure the bot with a freshly made config.json file instead of copying directly from config-sample.json.

  1. Base Settings
  2. Snitch Notifications
  3. Server Tools
  4. Web Applications
  5. API Fetch
  6. Anti-Raid
  7. Schedule Posts
  8. RSS Feeds
  9. Regex Rules
  10. Detect Suspicious Words
  11. Sync Roles
  12. Role Messages
  13. Auto Replies
  14. Message Copiers
  15. Message Proxies
  16. Remove Affiliates
  17. Toggle Permissions
  18. Bump Threads
  19. Impersonator Alerts
  20. Scammer Alerts
  21. Twitter Feeds
  22. Broadcast Alerts

1. Base Settings

For Stonker Bot to start, the required settings should be filled.

Key Type Description Required Accepted Values
settings object yes
settings.discord object yes
settings.discord.token string Token used to login to the Discord application yes Token found in Discord Developer Portal after configuring the Discord application
settings.discord.guild object yes
settings.discord.guild.description string Description of the guild no
settings.discord.guild.guild-id string Guild yes Discord guild ID
settings.twitter object no
settings.twitter.api-key string API key used to login to the Twitter application yes API key found in Twitter Developers after configuring the Twitter application
settings.twitter.api-key-secret string API key secret used to login to the Twitter application yes API key secret found in Twitter Developers after configuring the Twitter application
settings.twitter.access-token string Access token used to login to the Twitter user yes Access token found in Twitter Developers after configuring the Twitter application
settings.twitter.access-token-secret string Access token secret used to login to the Twitter user yes Access token secret found in Twitter Developers after configuring the Twitter application
settings.time-zone string Preferred time zone yes Time zones found in the tz database
settings.log-level number Verbosity level for logged messages yes 10 (error), 20 (warning), 30 (information), or 40 (debug)
{
  "settings": {
    "discord": {
      "token": "",
      "guild": {
        "description": "",
        "guild-id": ""
      }
    },
    "twitter": {
      "api-key": "",
      "api-key-secret": "",
      "access-token": "",
      "access-token-secret": ""
    },
    "time-zone": "Etc/UTC",
    "log-level": 30
  }
}

2. Snitch Notifications

Get notifications from user actions surrounding your server. You can pick between receiving notifications related to user changes, when a message status changes, or when a message includes a link or attachment.

Note: Only messages cached (during the current session or last edited within 30 days) will be tracked. To preserve cached events, you may create multiple configurable bot instances.

Key Type Description Required Accepted Values
snitch object no
snitch.change-nickname object no
snitch.change-nickname.channel object yes
snitch.change-nickname.channel.description string Description of the channel used to report nickname changes no
snitch.change-nickname.channel.channel-id string Channel used to report nickname changes yes Discord channel ID
snitch.change-username object no
snitch.change-username.channel object yes
snitch.change-username.channel.description string Description of the channel used to report username changes no
snitch.change-username.channel.channel-id string Channel used to report username changes yes Discord channel ID
snitch.delete-message object no
snitch.delete-message.channel object yes
snitch.delete-message.channel.description string Description of the channel used to report deleted messages no
snitch.delete-message.channel.channel-id string Channel used to report deleted messages yes Discord channel ID
snitch.guild-join object no
snitch.guild-join.channel object yes
snitch.guild-join.channel.description string Description of the channel used to report guild member join no
snitch.guild-join.channel.channel-id string Channel used to report guild member join yes Discord channel ID
snitch.guild-leave object no
snitch.guild-leave.channel object yes
snitch.guild-leave.channel.description string Description of the channel used to report guild member leave no
snitch.guild-leave.channel.channel-id string Channel used to report guild member leave yes Discord channel ID
snitch.includes-link object no
snitch.includes-link.channel object yes
snitch.includes-link.channel.description string Description of the channel used to report messages with links no
snitch.includes-link.channel.channel-id string Channel used to report messages with links yes Discord channel ID
snitch.includes-link.excluded-links object[] no
snitch.includes-link.excluded-links[x].name string Name of the excluded link no
snitch.includes-link.excluded-links[x].regex object yes
snitch.includes-link.excluded-links[x].regex.description string Description of the excluded link regex no
snitch.includes-link.excluded-links[x].regex.pattern string Regex pattern yes Read Writing a regular expression pattern
snitch.includes-link.excluded-links[x].regex.flags string Regex flags no Read Advanced searching with flags
snitch.role-change object no
snitch.role-change.channel object yes
snitch.role-change.channel.description string Description of the channel used to report guild member role change no
snitch.role-change.channel.channel-id string Channel used to report guild member role change yes Discord channel ID
snitch.update-message object no
snitch.update-message.channel object yes
snitch.update-message.channel.description string Description of the channel used to report edited messages no
snitch.update-message.channel.channel-id string Channel used to report edited messages yes Discord channel ID
snitch.upload-attachment object no
snitch.upload-attachment.channel object yes
snitch.upload-attachment.channel.description string Description of the channel used to report messages with attachments no
snitch.upload-attachment.channel.channel-id string Channel used to report messages with attachments yes Discord channel ID
{
  "snitch": {
    "change-nickname": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    "change-username": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    "delete-message": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    "guild-join": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    "guild-leave": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    "includes-link": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "excluded-links": [
        {
          "name": "Sample",
          "regex": {
            "description": "Sample regex",
            "pattern": "(.+)",
            "flags": "g"
          }
        }
      ]
    },
    "role-change": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    "update-message": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    "upload-attachment": {
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    }
  }
}

3. Server Tools

Easily manage your Discord server with these tools. Fetch information, manage roles, voice and stage channel controls, and ban multiple users with one command.

Key Type Description Required Accepted Values
server-tools object no
server-tools.bulk-ban object no
server-tools.bulk-ban.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
server-tools.bulk-ban.delete-message boolean Delete message when command runs no true or false
server-tools.bulk-ban.allowed-roles object[] no
server-tools.bulk-ban.allowed-roles[x].description string Description of the allowed role no
server-tools.bulk-ban.allowed-roles[x].role-id string Allowed role yes Discord role ID
server-tools.fetch-duplicates object no
server-tools.fetch-duplicates.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
server-tools.fetch-duplicates.delete-message boolean Delete message when command runs no true or false
server-tools.fetch-duplicates.allowed-roles object[] no
server-tools.fetch-duplicates.allowed-roles[x].description string Description of the allowed role no
server-tools.fetch-duplicates.allowed-roles[x].role-id string Allowed role yes Discord role ID
server-tools.fetch-emojis object no
server-tools.fetch emojis.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
server-tools.fetch-emojis.delete-message boolean Delete message when command runs no true or false
server-tools.fetch-emojis.allowed-roles object[] no
server-tools.fetch-emojis.allowed-roles[x].description string Description of the allowed role no
server-tools.fetch-emojis.allowed-roles[x].role-id string Allowed role yes Discord role ID
server-tools.fetch-members object no
server-tools.fetch-members.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
server-tools.fetch-members.delete-message boolean Delete message when command runs no true or false
server-tools.fetch-members.allowed-roles object[] no
server-tools.fetch-members.allowed-roles[x].description string Description of the allowed role no
server-tools.fetch-members.allowed-roles[x].role-id string Allowed role yes Discord role ID
server-tools.role-manager object no
server-tools.role-manager.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
server-tools.role-manager.delete-message boolean Delete message when command runs no true or false
server-tools.role-manager.allowed-roles object[] no
server-tools.role-manager.allowed-roles[x].description string Description of the allowed role no
server-tools.role-manager.allowed-roles[x].role-id string Allowed role yes Discord role ID
server-tools.voice-tools object no
server-tools.voice-tools.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
server-tools.voice-tools.delete-message boolean Delete message when command runs no true or false
server-tools.voice-tools.allowed-roles object[] no
server-tools.voice-tools.allowed-roles[x].description string Description of the allowed role no
server-tools.voice-tools.allowed-roles[x].role-id string Allowed role yes Discord role ID
{
  "server-tools": {
    "bulk-ban": {
      "base-commands": [
        "!ban"
      ],
      "delete-message": true,
      "allowed-roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ]
    },
    "fetch-duplicates": {
      "base-commands": [
        "!duplicates"
      ],
      "delete-message": true,
      "allowed-roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ]
    },
    "fetch-emojis": {
      "base-commands": [
        "!emojis"
      ],
      "delete-message": true,
      "allowed-roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ]
    },
    "fetch-members": {
      "base-commands": [
        "!members"
      ],
      "delete-message": true,
      "allowed-roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ]
    },
    "role-manager": {
      "base-commands": [
        "!role"
      ],
      "delete-message": true,
      "allowed-roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ]
    },
    "voice-tools": {
      "base-commands": [
        "!voice"
      ],
      "delete-message": true,
      "allowed-roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ]
    }
  }
}

4. Web Applications

Connect external applications and traffic into your Discord server. To enable web applications, at least one server (HTTP or HTTPS) must be configured.

  1. Invite Generator
  2. Map Webhooks

Note: During reboots, all web applications will be taken offline. To increase uptime, you may create multiple configurable bot instances.

Key Type Description Required Accepted Values
web-applications object no
web-applications.http-server object no
web-applications.http-server.port number Web server HTTP port yes From 1 to 65535
web-applications.https-server object no
web-applications.https-server.port number Web server HTTPS port yes From 1 to 65535
web-applications.https-server.key string Path to the private key file yes Absolute file path for the private key in PEM format
web-applications.https-server.cert string Path to the certificate chain file yes Absolute file path for the certificate chain in PEM format
web-applications.https-server.ca string Path to the certificate authority file yes Absolute file path for the certificate authority in PEM format
{
  "web-applications": {
    "http-server": {
      "port": 8080
    },
    "https-server": {
      "port": 8443,
      "key": "",
      "cert": "",
      "ca": ""
    }
  }
}

4.1. Invite Generator

A membership invite gate to protect your Discord server from being raided and spammed on. Authentication is made from Google's reCAPTCHA service. To customize the invite generator webpage, rename the invites-sample.ejs file to invites.ejs and begin editing.

Key Type Description Required Accepted Values
web-applications.invite-generator object no
web-applications.invite-generator.options object yes
web-applications.invite-generator.options.path string Path for accessing invite generator yes Paths begin with /. For example, a URL of https://www.example.com/invite would have a path of /invite
web-applications.invite-generator.options.max-age number Invite maximum age no Time in seconds (e.g. 1 minute equals 60)
web-applications.invite-generator.options.max-uses number Invite maximum uses no Whole numbers
web-applications.invite-generator.recaptcha object yes
web-applications.invite-generator.recaptcha.site-key string Google reCAPTCHA v2 checkbox site key yes Sign-up for a reCAPTCHA v2 checkbox
web-applications.invite-generator.recaptcha.secret-key string Google reCAPTCHA v2 checkbox secret key yes Sign-up for a reCAPTCHA v2 checkbox
{
  "web-applications": {
    "invite-generator": {
      "options": {
        "path": "/invite",
        "max-age": 120,
        "max-uses": 1
      },
      "recaptcha": {
        "site-key": "",
        "secret-key": ""
      }
    }
  }
}

4.2. Map Webhooks

Convert external webhooks (JSON-based) and send them as Discord messages. Use Discord as a back-office and stick to one platform!

Key Type Description Required Accepted Values
web-applications.map-webhooks object[] no
web-applications.map-webhooks[x].name string Name of the event no
web-applications.map-webhooks[x].path string Path for sending webhooks to yes Paths begin with /. For example, a URL of https://www.example.com/webhooks/sample would have a path of /webhooks/sample
web-applications.map-webhooks[x].variables object[] yes
web-applications.map-webhooks[x].variables[x].id string Variable identifier yes Capital letters and underscores. Underscores are not allowed in the beginning or end of the identifier
web-applications.map-webhooks[x].variables[x].type string Variable type yes string, boolean, ts-seconds, ts-millis, usd-dollars, or usd-cents
web-applications.map-webhooks[x].variables[x].path string Variable path yes Access the value from the path of the object. If the value is not supported, it will return a string value
web-applications.map-webhooks[x].payload object Message content to send for each webhook request yes BaseMessageOptions in discord.js Documentation. Variables include %YEAR%. To access incoming variables, define them like @SAMPLE@. SAMPLE is the value of web-applications.map-webhooks[x].variables[x].id
web-applications.map-webhooks[x].channel object yes
web-applications.map-webhooks[x].channel.description string Description of the channel used to send message content no
web-applications.map-webhooks[x].channel.channel-id string Channel used to send message content yes Discord channel ID
{
  "web-applications": {
    "map-webhooks": [
      {
        "name": "Sample",
        "path": "/webhooks/sample",
        "variables": [
          {
            "id": "SAMPLE_TEXT",
            "type": "string",
            "path": "path.to[0].sample-text"
          },
          {
            "id": "SAMPLE_TOGGLE",
            "type": "boolean",
            "path": "path.to[1].sample-toggle"
          },
          {
            "id": "SAMPLE_SECONDS",
            "type": "ts-seconds",
            "path": "path.to[2].sample-seconds"
          },
          {
            "id": "SAMPLE_MILLIS",
            "type": "ts-millis",
            "path": "path.to[3].sample-millis"
          },
          {
            "id": "SAMPLE_USD_DOLLARS",
            "type": "usd-dollars",
            "path": "path.to[4].sample-dollars"
          },
          {
            "id": "SAMPLE_USD_CENTS",
            "type": "usd-cents",
            "path": "path.to[5].sample-cents"
          }
        ],
        "payload": {
          "content": "@SAMPLE_TEXT@ - @SAMPLE_TOGGLE@ - @SAMPLE_SECONDS@ - @SAMPLE_MILLIS@ - @SAMPLE_USD_DOLLARS@ - @SAMPLE_USD_CENTS@",
          "footer": {
            "text": "Copyright © %YEAR% Your Company"
          }
        },
        "channel": {
          "description": "Sample channel",
          "channel-id": "000000000000000000"
        }
      }
    ]
  }
}

5. API Fetch

Retrieve updated information through a live feed and via a customizable keyword (like a command). Current APIs available are Etherscan, Finnhub, and Stocktwits.

Key Type Description Required Accepted Values
api-fetch object no
api-fetch.etherscan-gas-oracle object no
api-fetch.etherscan-gas-oracle.settings object no
api-fetch.etherscan-gas-oracle.settings.api-key string API key to access the Etherscan API no Sign up for an Etherscan API Key
api-fetch.etherscan-gas-oracle.channel object no
api-fetch.etherscan-gas-oracle.channel.description string Description of the channel used to send API updates no
api-fetch.etherscan-gas-oracle.channel.channel-id string Channel used to send API updates yes Discord channel ID
api-fetch.etherscan-gas-oracle.command object no
api-fetch.etherscan-gas-oracle.command.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
api-fetch.etherscan-gas-oracle.command.allowed-roles object[] no
api-fetch.etherscan-gas-oracle.command.allowed-roles[x].description string Description of the allowed role no
api-fetch.etherscan-gas-oracle.command.allowed-roles[x].role-id string Allowed role yes Discord role ID
api-fetch.etherscan-gas-oracle.command.no-perms-payload object Message content to send if user does not have permissions no BaseMessageOptions in discord.js Documentation. Variables include %YEAR%
api-fetch.finnhub-earnings object no
api-fetch.finnhub-earnings.settings object yes
api-fetch.finnhub-earnings.settings.api-key string API key to access the Finnhub API yes Sign up for a Finnhub API Key
api-fetch.finnhub-earnings.channel object no
api-fetch.finnhub-earnings.channel.description string Description of the channel used to send API updates no
api-fetch.finnhub-earnings.channel.channel-id string Channel used to send API updates yes Discord channel ID
api-fetch.finnhub-earnings.command object no
api-fetch.finnhub-earnings.command.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
api-fetch.finnhub-earnings.command.allowed-roles object[] no
api-fetch.finnhub-earnings.command.allowed-roles[x].description string Description of the allowed role no
api-fetch.finnhub-earnings.command.allowed-roles[x].role-id string Allowed role yes Discord role ID
api-fetch.finnhub-earnings.command.no-perms-payload object Message content to send if user does not have permissions no BaseMessageOptions in discord.js Documentation. Variables include %YEAR%
api-fetch.stocktwits-trending object no
api-fetch.stocktwits-trending.settings object no
api-fetch.stocktwits-trending.settings.limit number Symbols to retrieve for each retrieval no From 1 to 30
api-fetch.stocktwits-trending.channel object no
api-fetch.stocktwits-trending.channel.description string Description of the channel used to send API updates no
api-fetch.stocktwits-trending.channel.channel-id string Channel used to send API updates yes Discord channel ID
api-fetch.stocktwits-trending.command object no
api-fetch.stocktwits-trending.command.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
api-fetch.stocktwits-trending.command.allowed-roles object[] no
api-fetch.stocktwits-trending.command.allowed-roles[x].description string Description of the allowed role no
api-fetch.stocktwits-trending.command.allowed-roles[x].role-id string Allowed role yes Discord role ID
api-fetch.stocktwits-trending.command.no-perms-payload object Message content to send if user does not have permissions no BaseMessageOptions in discord.js Documentation. Variables include %YEAR%
{
  "api-fetch": {
    "etherscan-gas-oracle": {
      "settings": {
        "api-key": ""
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "command": {
        "base-commands": [
          "!gas"
        ],
        "allowed-roles": [
          {
            "description": "Sample role",
            "role-id": "000000000000000000"
          }
        ],
        "no-perms-payload": {
          "content": "You do not have sufficient permissions.",
          "footer": {
            "text": "Copyright © %YEAR% Your Company"
          }
        }
      }
    },
    "finnhub-earnings": {
      "settings": {
        "api-key": ""
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "command": {
        "base-commands": [
          "!earnings"
        ],
        "allowed-roles": [
          {
            "description": "Sample role",
            "role-id": "000000000000000000"
          }
        ],
        "no-perms-payload": {
          "content": "You do not have sufficient permissions.",
          "footer": {
            "text": "Copyright © %YEAR% Your Company"
          }
        }
      }
    },
    "stocktwits-trending": {
      "settings": {
        "limit": 30
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "command": {
        "base-commands": [
          "!trending"
        ],
        "allowed-roles": [
          {
            "description": "Sample role",
            "role-id": "000000000000000000"
          }
        ],
        "no-perms-payload": {
          "content": "You do not have sufficient permissions.",
          "footer": {
            "text": "Copyright © %YEAR% Your Company"
          }
        }
      }
    }
  }
}

6. Anti-Raid

A set of tools to ban members (based on their avatar or username), and helps automate the membership gate for those that just joined the server.

Note: Anti-raid will not auto ban or assign roles during restarts. To increase uptime, you may create multiple configurable bot instances.

Key Type Description Required Accepted Values
anti-raid object no
anti-raid.auto-ban object no
anti-raid.auto-ban.avatars object[] no
anti-raid.auto-ban.avatars[x].description string Description of the banned avatar no
anti-raid.auto-ban.avatars[x].avatar string Banned avatar yes File name of avatar (without the file extension)
anti-raid.auto-ban.usernames object[] no
anti-raid.auto-ban.usernames[x].description string Description of the banned username no
anti-raid.auto-ban.usernames[x].username string Banned username yes Username (do not include the discriminator)
anti-raid.membership-gate object no
anti-raid.membership-gate.roles object no
anti-raid.membership-gate.roles[x].description string Description of the role assigned to verified member no
anti-raid.membership-gate.roles[x].role-id string Role assigned to verified member yes Discord role ID
anti-raid.membership-gate.payload object Message content to send when user passes the membership gate no BaseMessageOptions in discord.js Documentation. Variables include %GUILD_NAME%, %MEMBER_MENTION%, and %YEAR%
anti-raid.membership-gate.channel object no
anti-raid.membership-gate.channel.description string Description of the channel used to send message content no
anti-raid.membership-gate.channel.channel-id string Channel used to send message content yes Discord channel ID
{
  "anti-raid": {
    "auto-ban": {
      "avatars": [
        {
          "description": "Sample avatar",
          "avatar": "00000000000000000000000000000000"
        }
      ],
      "usernames": [
        {
          "description": "Sample username",
          "username": "Bad User"
        }
      ]
    },
    "membership-gate": {
      "roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ],
      "payload": {
        "content": "Welcome to %GUILD_NAME%! Thank you for verifying, %MEMBER_MENTION%.",
        "footer": {
          "text": "Copyright © %YEAR% Your Company"
        }
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    }
  }
}

7. Schedule Posts

You can schedule messages to be sent out to a specific text-based channel. No more inconsistently timed messages! You are also able to skip specific dates from posting (like a holiday, for instance) and even send on a specific day.

Key Type Description Required Accepted Values
schedule-posts object[] no
schedule-posts[x].name string Name of the event no
schedule-posts[x].payload object Message content to send when time ticks yes BaseMessageOptions in discord.js Documentation. Variables include %YEAR%
schedule-posts[x].reactions string[] Message reactions no Unicode emojis or a custom emoji identifier string (<:sample:000000000000000000> for static, <a:sample:000000000000000000> for animated)
schedule-posts[x].channel object no
schedule-posts[x].channel.description string Description of the channel used to send message content no
schedule-posts[x].channel.channel-id string Channel used to send message content yes Discord channel ID
schedule-posts[x].send-on object no
schedule-posts[x].send-on.time-zone string Send on time zone no Time zones found in the tz database
schedule-posts[x].send-on.days-of-week number[] Send on day of week no 0 (Sunday), 1 (Monday), 2 (Tuesday), 3 (Wednesday), 4 (Thursday), 5 (Friday), and 6 (Saturday)
schedule-posts[x].send-on.months number[] Send on month no From 1 to 12
schedule-posts[x].send-on.dates number[] Send on date no From 1 to 31
schedule-posts[x].send-on.hours number[] Send on hour of day no From 0 to 23
schedule-posts[x].send-on.minutes number[] Send on minute of hour no From 0 to 59
schedule-posts[x].send-on.seconds number[] Send on second of minute no From 0 to 59
schedule-posts[x].skip-dates string[] Skip on specified dates no Date format is YYYY-MM-DD
{
  "schedule-posts": [
    {
      "name": "Sample",
      "payload": {
        "content": "This is a sample scheduled post",
        "footer": {
          "text": "Copyright © %YEAR% Your Company"
        }
      },
      "reactions": [
        "🟢",
        "🟡",
        "🔴"
      ],
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "send-on": {
        "time-zone": "Etc/UTC",
        "days-of-week": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "months": [
          1
        ],
        "dates": [
          1
        ],
        "hours": [
          0
        ],
        "minutes": [
          0
        ],
        "seconds": [
          0
        ]
      },
      "skip-dates": [
        "2021-01-01",
        "2021-02-01"
      ]
    }
  ]
}

8. RSS Feeds

Sends out messages when an update from external RSS feeds are detected. Control how often you want the bot to fetch updates. You may also choose to have links resolved to their final destination and have parameters removed as well.

Note: For Google News RSS Feeds, the source will be stripped from the title automatically.

Key Type Description Required Accepted Values
rss-feeds object[] no
rss-feeds[x].name string Name of the event no
rss-feeds[x].url string Link to RSS feed yes Fully qualified URL
rss-feeds[x].user-agent string User agent to use when retrieving RSS feed no Most popular user agents found in Tech Blog (wh)
rss-feeds[x].follow-redirects boolean Follow redirects for each RSS update no true or false
rss-feeds[x].remove-parameters boolean Remove all parameters for each RSS update no true or false
rss-feeds[x].allowed-urls string[] Allow only URLs you specify to be sent no Partial URL beginning with. For example, https://www.example.com/news/example.html is allowed if https://www.example.com/news/ is specified
rss-feeds[x].payload object Message content to send for each RSS update yes BaseMessageOptions in discord.js Documentation. Variables include %ITEM_LINK% and %ITEM_TITLE%
rss-feeds[x].channel object yes
rss-feeds[x].channel.description string Description of the channel used to send message content no
rss-feeds[x].channel.channel-id string Channel used to send message content yes Discord channel ID
rss-feeds[x].fetch-on object no
rss-feeds[x].fetch-on.time-zone string Fetch on time zone no Time zones found in the tz database
rss-feeds[x].fetch-on.days-of-week number[] Fetch on day of week no 0 (Sunday), 1 (Monday), 2 (Tuesday), 3 (Wednesday), 4 (Thursday), 5 (Friday), and 6 (Saturday)
rss-feeds[x].fetch-on.months number[] Fetch on month no From 1 to 12
rss-feeds[x].fetch-on.dates number[] Fetch on date no From 1 to 31
rss-feeds[x].fetch-on.hours number[] Fetch on hour of day no From 0 to 23
rss-feeds[x].fetch-on.minutes number[] Fetch on minute of hour no From 0 to 59
rss-feeds[x].fetch-on.seconds number[] Fetch on second of minute no From 0 to 59
{
  "rss-feeds": [
    {
      "name": "Sample",
      "url": "https://www.example.com/feed",
      "user-agent": "stonker-bot",
      "follow-redirects": true,
      "remove-parameters": true,
      "allowed-urls": [
        "https://www.example.com/news/"
      ],
      "payload": {
        "content": "Sample: %ITEM_TITLE% - %ITEM_LINK%"
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "fetch-on": {
        "time-zone": "Etc/UTC",
        "days-of-week": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "months": [
          1
        ],
        "dates": [
          1
        ],
        "hours": [
          0
        ],
        "minutes": [
          0
        ],
        "seconds": [
          0
        ]
      }
    }
  ]
}

9. Regex Rules

Restrict a specific format and disallow specific text in a channel or the entire server. If the message matches or does not match the regular expression, the message will be deleted (unless member is a server owner, administrator, or listed under excluded roles).

This feature can be extended with the delete message notification.

Note: Please prioritize channel restrictions before server-wide restrictions because only the first match will be considered.

Key Type Description Required Accepted Values
regex-rules object[] no
regex-rules[x].name string Name of the event no
regex-rules[x].channel object no
regex-rules[x].channel.description string Description of the channel used to apply regex restrictions on no
regex-rules[x].channel.channel-id string Channel used to apply regex restrictions on yes Discord channel ID
regex-rules[x].match boolean When text matches or does not match the regex yes true or false
regex-rules[x].regex object yes
regex-rules[x].regex.description string Description of the match regex no
regex-rules[x].regex.pattern string Regex pattern yes Read Writing a regular expression pattern
regex-rules[x].regex.flags string Regex flags no Read Advanced searching with flags
regex-rules[x].excluded-roles object[] no
regex-rules[x].excluded-roles[x].description string Description of the excluded role no
regex-rules[x].excluded-roles[x].role-id string Excluded role yes Discord role ID
regex-rules[x].direct-message-payload object Message content to send when user does not follow regex rule no BaseMessageOptions in discord.js Documentation
{
  "regex-rules": [
    {
      "name": "Sample",
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "match": false,
      "regex": {
        "description": "Sample regex",
        "pattern": "(.+)",
        "flags": "g"
      },
      "excluded-roles": [
        {
          "description": "Sample role",
          "role-id": "000000000000000000"
        }
      ],
      "direct-message-payload": {
        "content": "This type of text is not allowed in this channel!"
      }
    }
  ]
}

10. Detect Suspicious Words

Detect words in a message that may require attention. Useful when a member mentions a person of interest (without tagging them) or detection of vulgar language that often do not require warnings or deletion.

Key Type Description Required Accepted Values
detect-suspicious-words object no
detect-suspicious-words.categories object[] yes
detect-suspicious-words.categories[x].category string Name of the category no
detect-suspicious-words.categories[x].words string[] List of suspicious words yes Alphabetical variants only. Non-alphabetical conversion will be attempted. For example, "he110" will be converted to "hello"
detect-suspicious-words.channel object yes
detect-suspicious-words.channel.description string Description of the channel used to report suspicious words no
detect-suspicious-words.channel.channel-id string Channel used to report suspicious words yes Discord channel ID
{
  "detect-suspicious-words": {
    "categories": [
      {
        "category": "Sample",
        "words": [
          "suspicious",
          "really suspicious"
        ]
      }
    ],
    "channel": {
      "description": "Sample channel",
      "channel-id": "000000000000000000"
    }
  }
}

11. Sync Roles

Add or remove selected roles from members automatically if a user has or does not have "some" roles. Useful for many scenarios, for example, when members lose a premium role (e.g. removing premium add-on roles) or when members get muted (e.g. removing roles purposely designed to enable sending of messages, speaking in voice channels, or creating new reactions).

Note: Please prioritize role removals before role additions due to how Discord processes role changes.

Key Type Description Required Accepted Values
sync-roles object no
sync-roles.timeout number Time to wait after the last role change yes Time in seconds (e.g. 1 minute equals 60)
sync-roles.events object[] yes
sync-roles.events[x].name string Name of the event no
sync-roles.events[x].some-roles object[] yes
sync-roles.events[x].some-roles[x].description string Description of the role no
sync-roles.events[x].some-roles[x].role-id string Role yes Discord role ID
sync-roles.events[x].has-some-roles boolean When user has or does not have some of the roles yes true or false
sync-roles.events[x].to-add-roles object[] no
sync-roles.events[x].to-add-roles[x].description string Description of the role to add no
sync-roles.events[x].to-add-roles[x].role-id string Role to add yes Discord role ID
sync-roles.events[x].to-remove-roles object[] no
sync-roles.events[x].to-remove-roles[x].description string Description of the role to remove no
sync-roles.events[x].to-remove-roles[x].role-id string Role to remove yes Discord role ID
{
  "sync-roles": {
    "timeout": 1,
    "events": [
      {
        "name": "Sample",
        "some-roles": [
          {
            "description": "A role",
            "role-id": "000000000000000000"
          }
        ],
        "has-some-roles": true,
        "to-remove-roles": [
          {
            "description": "B role",
            "role-id": "000000000000000000"
          }
        ]
      },
      {
        "name": "Sample",
        "some-roles": [
          {
            "description": "A role",
            "role-id": "000000000000000000"
          }
        ],
        "has-some-roles": false,
        "to-add-roles": [
          {
            "description": "B role",
            "role-id": "000000000000000000"
          }
        ]
      }
    ]
  }
}

12. Role Messages

Sends out messages when a role is added to or removed from a user. Perfect for social proof, welcoming new members, and internal analytics!

Key Type Description Required Accepted Values
role-messages object[] no
role-messages[x].name string Name of the event no
role-messages[x].role object yes
role-messages[x].role.description string Description of the role no
role-messages[x].role.role-id string Role yes Discord role ID
role-messages[x].direction string When user obtains a role or relinquishes a role yes add or remove
role-messages[x].payload object Message content to send when user obtains or relinquishes a role yes BaseMessageOptions in discord.js Documentation. Variables include %MEMBER_MENTION% and %YEAR%
role-messages[x].channel object yes
role-messages[x].channel.description string Description of the channel used to send message content no
role-messages[x].channel.channel-id string Channel used to send message content yes Discord channel ID
{
  "role-messages": [
    {
      "name": "Sample",
      "role": {
        "description": "Sample role",
        "role-id": "000000000000000000"
      },
      "direction": "add",
      "payload": {
        "content": "%MEMBER_MENTION% has obtained a role.",
        "footer": {
          "text": "Copyright © %YEAR% Your Company"
        }
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    },
    {
      "name": "Sample",
      "role": {
        "description": "Sample role",
        "role-id": "000000000000000000"
      },
      "direction": "remove",
      "payload": {
        "content": "%MEMBER_MENTION% has relinquished a role.",
        "footer": {
          "text": "Copyright © %YEAR% Your Company"
        }
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    }
  ]
}

13. Auto Replies

Reply to a message without requiring human interaction. Great for automated customer service or to plant hidden Easter eggs!

Note: Please prioritize channel-restricted replies before server-wide replies because only the first match will be considered.

Key Type Description Required Accepted Values
auto-replies object[] no
auto-replies[x].name string Name of the event no
auto-replies[x].channels object[] no
auto-replies[x].channels[x].description string Description of the channel used to detect reply-able messages no
auto-replies[x].channels[x].channel-id string Channel used to detect reply-able messages yes Discord channel ID
auto-replies[x].regex object yes
auto-replies[x].regex.description string Description of the reply-able regex no
auto-replies[x].regex.pattern string Regex pattern yes Read Writing a regular expression pattern
auto-replies[x].regex.flags string Regex flags no Read Advanced searching with flags
auto-replies[x].payloads object[] Message content to send if reply-able messages are detected (one will be randomly selected) yes BaseMessageOptions in discord.js Documentation
auto-replies[x].reply boolean Reply to message author no true or false
{
  "auto-replies": [
    {
      "name": "Sample",
      "channels": [
        {
          "description": "Sample channel",
          "channel-id": "000000000000000000"
        }
      ],
      "regex": {
        "description": "Sample regex",
        "pattern": "(.+)",
        "flags": "gi"
      },
      "payloads": [
        {
          "content": "reply 1"
        },
        {
          "content": "reply 2"
        }
      ],
      "reply": true
    }
  ]
}

14. Message Copiers

Automatically copy the original message that matches the regular expression (in addition to the allowed/disallowed users or channels to copy from) into another channel, another Discord server channel, or a Twitter account. A powerful utility to route content in Discord.

Note: Only 1 to 4 images (JPE, JPG, JPEG, PNG, WEBP) or 1 animated image (GIF) is allowed per tweet. Images first, then GIFs. If both limits are not respected, no attachments will be uploaded to Twitter.

Note 2: Message edits, deletions, and replies will not be passed onto their offsets.

Key Type Description Required Accepted Values
message-copiers object[] no
message-copiers[x].name string Name of the event no
message-copiers[x].regex object yes
message-copiers[x].regex.description string Description of the message copier regex no
message-copiers[x].regex.pattern string Regex pattern yes Read Writing a regular expression pattern
message-copiers[x].regex.flags string Regex flags no Read Advanced searching with flags
message-copiers[x].allowed-users object[] no
message-copiers[x].allowed-users[x].description string Description of the allowed user (only copy messages sent by) no
message-copiers[x].allowed-users[x].user-id string Allowed user (only copy messages sent by) yes Discord user ID
message-copiers[x].allowed-channels object[] no
message-copiers[x].allowed-channels[x].description string Description of the allowed channel (only copy messages sent in) no
message-copiers[x].allowed-channels[x].channel-id string Allowed channel (only copy messages sent in) yes Discord channel ID
message-copiers[x].disallowed-users object[] no
message-copiers[x].disallowed-users[x].description string Description of the disallowed user (only copy messages not sent by) no
message-copiers[x].disallowed-users[x].user-id string Disallowed user (only copy messages not sent by) yes Discord user ID
message-copiers[x].disallowed-channels object[] no
message-copiers[x].disallowed-channels[x].description string Description of the disallowed channel (only copy messages not sent in) no
message-copiers[x].disallowed-channels[x].channel-id string Disallowed channel (only copy messages not sent in) yes Discord channel ID
message-copiers[x].replacements object[] no
message-copiers[x].replacements[x].description string Description of the replacement regex no
message-copiers[x].replacements[x].pattern string Regex pattern yes Read Writing a regular expression pattern
message-copiers[x].replacements[x].flags string Regex flags no Read Advanced searching with flags
message-copiers[x].replacements[x].replace-with string Replace with yes Read Using a regular expression to change data format
message-copiers[x].message string Message content to send when message copier runs no 2000 characters maximum (280 characters maximum for Twitter). Variables include %CHANNEL_MENTION%, %MEMBER_MENTION%, %MEMBER_TAG%, %MESSAGE_CONTENT%, %MESSAGE_EXCERPT%, and %MESSAGE_URL%
message-copiers[x].include-attachments boolean Include attachments no true or false
message-copiers[x].destinations object yes
message-copiers[x].destinations[x].description string Description of the destination method no
message-copiers[x].destinations[x].method string Destination method yes discord-channel discord-webhook or twitter-account
message-copiers[x].destinations[x].channel object no (yes, if method is discord-channel)
message-copiers[x].destinations[x].channel.description string Description of the channel used to send message content no
message-copiers[x].destinations[x].channel.channel-id string Channel used to send message content yes Discord channel ID
message-copiers[x].destinations[x].webhook object no (yes, if method is discord-webhook)
message-copiers[x].destinations[x].webhook.description string Description of the webhook no
message-copiers[x].destinations[x].webhook.username string Webhook default username no
message-copiers[x].destinations[x].webhook.avatar-url string Webhook default avatar URL no Fully qualified URL
message-copiers[x].destinations[x].webhook.url string Link to webhook yes Discord webhook link
{
  "message-copiers": [
    {
      "name": "Sample",
      "regex": {
        "description": "Sample regex",
        "pattern": "(.+)",
        "flags": "g"
      },
      "allowed-users": [
        {
          "description": "Sample user",
          "user-id": "000000000000000000"
        }
      ],
      "allowed-channels": [
        {
          "description": "Sample channel",
          "channel-id": "000000000000000000"
        }
      ],
      "disallowed-users": [
        {
          "description": "Sample user",
          "user-id": "000000000000000000"
        }
      ],
      "disallowed-channels": [
        {
          "description": "Sample channel",
          "channel-id": "000000000000000000"
        }
      ],
      "replacements": [
        {
          "description": "Sample regex",
          "pattern": "(.+)",
          "flags": "g",
          "replace-with": "$1"
        }
      ],
      "message": "Channel Mention: %CHANNEL_MENTION%\nMember Mention: %MEMBER_MENTION%\nMember Tag: %MEMBER_TAG%\nMessage Content: %MESSAGE_CONTENT%\nMessage Excerpt: %MESSAGE_EXCERPT%\nMessage URL: %MESSAGE_URL%",
      "include-attachments": true,
      "destinations": [
        {
          "description": "Send to Discord channel",
          "method": "discord-channel",
          "channel": {
            "description": "Sample channel",
            "channel-id": "000000000000000000"
          }
        },
        {
          "description": "Send to Discord webhook",
          "method": "discord-webhook",
          "webhook": {
            "description": "Sample webhook",
            "username": "Author",
            "avatar-url": "https://example.com/example.jpg",
            "url": "https://discord.com/api/webhooks/000000000000000000/ABCDEFGHIJKLMNOPQRSTUVWXYZ-abcdefghijklmnopqrstuvwxyzZ1234567890"
          }
        },
        {
          "description": "Send to Twitter account",
          "method": "twitter-account"
        }
      ]
    }
  ]
}

15. Message Proxies

Allows you to containerize third-party Discord bots away from the primary Discord server. Forward bot messages via webhooks. Designed for corporate environments and greatly enhances security measures.

Note: Replacements will expose the entire payload using regular expression. Please use with caution.

Note 2: Message edits and deletions will not be passed onto their offsets.

Key Type Description Required Accepted Values
message-proxies object[] no
message-proxies[x].name string Name of the event no
message-proxies[x].channel object yes
message-proxies[x].channel.description string Description of the channel used to detect bot messages no
message-proxies[x].channel.channel-id string Channel used to detect bot messages yes Discord channel ID
message-proxies[x].replacements object[] no
message-proxies[x].replacements[x].description string Description of the replacement regex no
message-proxies[x].replacements[x].pattern string Regex pattern yes Read Writing a regular expression pattern
message-proxies[x].replacements[x].flags string Regex flags no Read Advanced searching with flags
message-proxies[x].replacements[x].replace-with string Replace with yes Read Using a regular expression to change data format. Variables include %YEAR%
message-proxies[x].print-payload boolean Print the "payload_json" value before and after replacements no true or false
message-proxies[x].webhook object yes
message-proxies[x].webhook.description string Description of the webhook no
message-proxies[x].webhook.webhook-url string Link to webhook yes Discord webhook link
{
  "message-proxies": [
    {
      "name": "Sample",
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "replacements": [
        {
          "description": "Sample regex",
          "pattern": "(.+)",
          "flags": "g",
          "replace-with": "$1"
        }
      ],
      "print-payload": true,
      "webhook": {
        "description": "Sample webhook",
        "webhook-url": "https://discord.com/api/webhooks/000000000000000000/ABCDEFGHIJKLMNOPQRSTUVWXYZ-abcdefghijklmnopqrstuvwxyzZ1234567890"
      }
    }
  ]
}

16. Remove Affiliates

Easily remove content used to advertise for self gain, many of them unauthorized and undetected. This feature will automatically remove them, send a direct message to the user, and logs the message.

This feature can be extended with the delete message notification.

Key Type Description Required Accepted Values
remove-affiliates object no
remove-affiliates.platforms object[] yes
remove-affiliates.platforms[x].platform string Name of the platform no
remove-affiliates.platforms[x].regex.description string Description of the platform regex no
remove-affiliates.platforms[x].regex.pattern string Regex pattern yes Read Writing a regular expression pattern
remove-affiliates.platforms[x].regex.flags string Regex flags no Read Advanced searching with flags
remove-affiliates.excluded-roles object[] no
remove-affiliates.excluded-roles[x].description string Description of the excluded role no
remove-affiliates.excluded-roles[x].role-id string Excluded role yes Discord role ID
remove-affiliates.channel object no
remove-affiliates.channel.description string Description of the channel used to report affiliate posts no
remove-affiliates.channel.channel-id string Channel used to report affiliate posts yes Discord channel ID
remove-affiliates.direct-message-payload object Message content to send when user posts an affiliate no BaseMessageOptions in discord.js Documentation
{
  "remove-affiliates": {
    "platforms": [
      {
        "platform": "Sample",
        "regex": {
          "description": "Sample regex",
          "pattern": "(.+)",
          "flags": "gi"
        }
      }
    ],
    "excluded-roles": [
      {
        "description": "Sample role",
        "role-id": "000000000000000000"
      }
    ],
    "channel": {
      "description": "Sample channel",
      "channel-id": "000000000000000000"
    },
    "direct-message-payload": {
      "content": "Please do not send affiliate content!"
    }
  }
}

17. Toggle Permissions

Configure channel and category permissions automatically through a scheduler or manually through a command! Great for showing and hiding channels during special events!

This feature can be extended with Schedule Posts.

Key Type Description Required Accepted Values
toggle-perms object[] no
toggle-perms[x].name string Name of the event no
toggle-perms[x].command object no
toggle-perms[x].command.base-commands string[] Keywords to initiate command yes If there are prefixes, it is recommended to keep them exact
toggle-perms[x].command.allowed-roles object[] no
toggle-perms[x].command.allowed-roles[x].description string Description of the allowed role no
toggle-perms[x].command.allowed-roles[x].role-id string Allowed role yes Discord role ID
toggle-perms[x].toggle-on object no
toggle-perms[x].toggle-on.time-zone string Toggle on time zone no Time zones found in the tz database
toggle-perms[x].toggle-on.days-of-week number[] Toggle on day of week no 0 (Sunday), 1 (Monday), 2 (Tuesday), 3 (Wednesday), 4 (Thursday), 5 (Friday), and 6 (Saturday)
toggle-perms[x].toggle-on.months number[] Toggle on month no From 1 to 12
toggle-perms[x].toggle-on.dates number[] Toggle on date no From 1 to 31
toggle-perms[x].toggle-on.hours number[] Toggle on hour of day no From 0 to 23
toggle-perms[x].toggle-on.minutes number[] Toggle on minute of hour no From 0 to 59
toggle-perms[x].toggle-on.seconds number[] Toggle on second of minute no From 0 to 59
toggle-perms[x].skip-dates string[] Skip on specified dates no Date format is YYYY-MM-DD
toggle-perms[x].toggles object[] yes
toggle-perms[x].toggles[x].description string Description of the toggle no
toggle-perms[x].toggles[x].channel object yes
toggle-perms[x].toggles[x].channel.description string Description of the channel used to toggle permissions on no
toggle-perms[x].toggles[x].channel.channel-id string Channel used to toggle permissions on yes Discord channel ID
toggle-perms[x].toggles[x].permissions object[] yes
toggle-perms[x].toggles[x].permissions[x].description string Description of the user or role no
toggle-perms[x].toggles[x].permissions[x].user-or-role-id string User or role yes Discord user or role ID
toggle-perms[x].toggles[x].permissions[x].user-or-role-perms object User or role permissions yes Review the permission flags. Permission flags should be set to pascal case (e.g. SEND_MESSAGES to SendMessages). Set flags to true (green), null (gray), false (red)
{
  "toggle-perms": [
    {
      "name": "Sample",
      "command": {
        "base-commands": [
          "!sample-on"
        ],
        "allowed-roles": [
          {
            "description": "Sample role",
            "role-id": "000000000000000000"
          }
        ]
      },
      "toggle-on": {
        "time-zone": "Etc/UTC",
        "days-of-week": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "months": [
          1
        ],
        "dates": [
          1
        ],
        "hours": [
          0
        ],
        "minutes": [
          0
        ],
        "seconds": [
          0
        ]
      },
      "skip-dates": [
        "2021-01-01",
        "2021-02-01"
      ],
      "toggles": [
        {
          "description": "Allow view channel and send messages for Sample channel",
          "channel": {
            "description": "Sample channel",
            "channel-id": "000000000000000000"
          },
          "permissions": [
            {
              "description": "Sample role",
              "user-or-role-id": "000000000000000000",
              "user-or-role-perms": {
                "ViewChannel": true,
                "SendMessages": true
              }
            }
          ]
        }
      ]
    }
  ]
}

18. Bump Threads

Stretch the world of threads and make them like sub-channels! Create threads that never archive, even if you don't have boosted servers.

Note: If threads are un-archived immediately after bot startup and one or more features send messages through threads, please restart the bot again to ensure proper operation.

Key Type Description Required Accepted Values
bump-threads object[] no
bump-threads[x].name string Name of the event no
bump-threads[x].channel object yes
bump-threads[x].channel.description string Description of the channel used to bump thread in no
bump-threads[x].channel.channel-id string Channel used to bump thread in yes Discord channel ID
bump-threads[x].thread object yes
bump-threads[x].thread.description string Description of the thread to bump no
bump-threads[x].thread.thread-id string Thread to bump yes Discord thread ID
{
  "bump-threads": [
    {
      "name": "Sample",
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      },
      "thread": {
        "description": "Sample thread",
        "thread-id": "000000000000000000"
      }
    }
  ]
}

19. Impersonator Alerts

Get notifications when your Discord identity or entity (e.g. your company's name) is being used without your knowledge (especially when scams and fraudulent activity is on the rise).

Key Type Description Required Accepted Values
impersonator-alerts object no
impersonator-alerts.entities object[] yes
impersonator-alerts.entities[x].name string Name of the entity no
impersonator-alerts.entities[x].user object no
impersonator-alerts.entities[x].user.description string Description of the tracked user no
impersonator-alerts.entities[x].user.user-id string Tracked user yes Discord user ID
impersonator-alerts.entities[x].regex object yes
impersonator-alerts.entities[x].regex.description string Description of the nickname or username regex no
impersonator-alerts.entities[x].regex.pattern string Regex pattern yes Read Writing a regular expression pattern
impersonator-alerts.entities[x].regex.flags string Regex flags no Read Advanced searching with flags
impersonator-alerts.entities[x].payload object Message content to send when there are matched nicknames or usernames no BaseMessageOptions in discord.js Documentation. Variables include %MEMBER_USER_MENTION%
impersonator-alerts.channel object yes
impersonator-alerts.channel.description string Description of the channel used to send impersonator alerts no
impersonator-alerts.channel.channel-id string Channel used to send impersonator alerts yes Discord channel ID
{
  "impersonator-alerts": {
    "entities": [
      {
        "name": "Sample",
        "user": {
          "description": "Sample user",
          "user-id": "000000000000000000"
        },
        "regex": {
          "description": "Sample regex",
          "pattern": "(.+)",
          "flags": "g"
        },
        "payload": {
          "content": "An impersonator may have been detected. The offending user is %MEMBER_USER_MENTION%."
        }
      }
    ],
    "channel": {
      "description": "Sample channel",
      "channel-id": "000000000000000000"
    }
  }
}

20. Scammer Alerts

Get notifications when unwanted users (known primarily as scammers or spammers) enter your Discord server.

Key Type Description Required Accepted Values
scammer-alerts object no
scammer-alerts.entities object[] yes
scammer-alerts.entities[x].name string Name of the entity no
scammer-alerts.entities[x].regex object yes
scammer-alerts.entities[x].regex.description string Description of the nickname or username regex no
scammer-alerts.entities[x].regex.pattern string Regex pattern yes Read Writing a regular expression pattern
scammer-alerts.entities[x].regex.flags string Regex flags no Read Advanced searching with flags
scammer-alerts.entities[x].payload object Message content to send when there are matched nicknames or usernames no BaseMessageOptions in discord.js Documentation. Variables include %MEMBER_USER_MENTION%
scammer-alerts.channel object yes
scammer-alerts.channel.description string Description of the channel used to send scammer alerts no
scammer-alerts.channel.channel-id string Channel used to send scammer alerts yes Discord channel ID
{
  "scammer-alerts": {
    "entities": [
      {
        "name": "Sample",
        "regex": {
          "description": "Sample regex",
          "pattern": "(.+)",
          "flags": "g"
        },
        "payload": {
          "content": "A scammer may have been detected. The offending user is %MEMBER_USER_MENTION%."
        }
      }
    ],
    "channel": {
      "description": "Sample channel",
      "channel-id": "000000000000000000"
    }
  }
}

21. Twitter Feeds

Receive tweets from other users on Twitter and send them directly to your channel or threads. Optionally exclude retweets and replies as well.

Note: To ensure feed availability even when the user protects their tweets, it is recommended that you follow the Twitter handle.

Key Type Description Required Accepted Values
twitter-feeds object[] no
twitter-feeds[x].name string Name of the event no
twitter-feeds[x].twitter-id string User ID yes Visit Find Twitter ID
twitter-feeds[x].exclude-retweets boolean Exclude retweets no true or false
twitter-feeds[x].exclude-replies boolean Exclude replies no true or false
twitter-feeds[x].payload object Message content to send for each Twitter feed update no BaseMessageOptions in discord.js Documentation. Variables include %TWEET_TEXT% and %TWEET_LINK%
twitter-feeds[x].channel object yes
twitter-feeds[x].channel.description string Description of the channel used to send message content no
twitter-feeds[x].channel.channel-id string Channel used to send message content yes Discord channel ID
{
  "twitter-feeds": [
    {
      "name": "Sample",
      "twitter-id": "000000",
      "exclude-retweets": false,
      "exclude-replies": false,
      "payload": {
        "content": "Sample: %TWEET_TEXT% - %TWEET_LINK%"
      },
      "channel": {
        "description": "Sample channel",
        "channel-id": "000000000000000000"
      }
    }
  ]
}

22. Broadcast Alerts

Automatically send Discord events to Twitter. Event broadcast alerts are determined by the status, the entity types, and the creator.

Key Type Description Required Accepted Values
broadcast-alerts object[] no
broadcast-alerts[x].name string Name of the event no
broadcast-alerts[x].status string Event status yes SCHEDULED, UPDATED, ACTIVE, COMPLETED, or CANCELED
broadcast-alerts[x].entity-types string[] Event entity types yes STAGE_INSTANCE, VOICE, and EXTERNAL
broadcast-alerts[x].creator object yes
broadcast-alerts[x].creator.description string Description of the event creator no
broadcast-alerts[x].creator.user-id string Event creator yes Discord user ID
broadcast-alerts[x].message string Message content to send when broadcast alert runs yes 280 characters maximum. Variables include %CHANNEL_TAG%, %CREATOR_TAG%, %EVENT_DESCRIPTION%, %EVENT_NAME%, %LOCATION%, %SCHEDULED_TIME%, and %USER_COUNT%
{
  "broadcast-alerts": [
    {
      "name": "Sample",
      "status": "SCHEDULED",
      "entity-types": [
        "STAGE_INSTANCE",
        "VOICE",
        "EXTERNAL"
      ],
      "creator": {
        "description": "Sample user",
        "user-id": "000000000000000000"
      },
      "message": "Event scheduled\nName: %EVENT_NAME%\nDescription: %EVENT_DESCRIPTION%\nCreator Tag: %CREATOR_TAG%\nTime: %SCHEDULED_TIME%\nChannel Tag: %CHANNEL_TAG%\nLocation: %LOCATION%\nUser Count: %USER_COUNT%"
    },
    {
      "name": "Sample",
      "status": "UPDATED",
      "entity-types": [
        "STAGE_INSTANCE",
        "VOICE",
        "EXTERNAL"
      ],
      "creator": {
        "description": "Sample user",
        "user-id": "000000000000000000"
      },
      "message": "Event updated\nName: %EVENT_NAME%\nDescription: %EVENT_DESCRIPTION%\nCreator Tag: %CREATOR_TAG%\nTime: %SCHEDULED_TIME%\nChannel Tag: %CHANNEL_TAG%\nLocation: %LOCATION%\nUser Count: %USER_COUNT%"
    },
    {
      "name": "Sample",
      "status": "ACTIVE",
      "entity-types": [
        "STAGE_INSTANCE",
        "VOICE",
        "EXTERNAL"
      ],
      "creator": {
        "description": "Sample user",
        "user-id": "000000000000000000"
      },
      "message": "Event active\nName: %EVENT_NAME%\nDescription: %EVENT_DESCRIPTION%\nCreator Tag: %CREATOR_TAG%\nTime: %SCHEDULED_TIME%\nChannel Tag: %CHANNEL_TAG%\nLocation: %LOCATION%\nUser Count: %USER_COUNT%"
    },
    {
      "name": "Sample",
      "status": "COMPLETED",
      "entity-types": [
        "STAGE_INSTANCE",
        "VOICE",
        "EXTERNAL"
      ],
      "creator": {
        "description": "Sample user",
        "user-id": "000000000000000000"
      },
      "message": "Event completed\nName: %EVENT_NAME%\nDescription: %EVENT_DESCRIPTION%\nCreator Tag: %CREATOR_TAG%\nTime: %SCHEDULED_TIME%\nChannel Tag: %CHANNEL_TAG%\nLocation: %LOCATION%\nUser Count: %USER_COUNT%"
    },
    {
      "name": "Sample",
      "status": "CANCELED",
      "entity-types": [
        "STAGE_INSTANCE",
        "VOICE",
        "EXTERNAL"
      ],
      "creator": {
        "description": "Sample user",
        "user-id": "000000000000000000"
      },
      "message": "Event canceled\nName: %EVENT_NAME%\nDescription: %EVENT_DESCRIPTION%\nCreator Tag: %CREATOR_TAG%\nTime: %SCHEDULED_TIME%\nChannel Tag: %CHANNEL_TAG%\nLocation: %LOCATION%\nUser Count: %USER_COUNT%"
    }
  ]
}