Utility

Custom Commands

Build your own commands for your server with a full scripting engine — variables, conditions, and actions like sending messages, adding roles, and more.

What custom commands do

Custom commands let you create commands unique to your server. Unlike autoresponders (which simply reply to matching messages with canned text), custom commands are invoked deliberately by name and can run real logic: read variables, branch on conditions, take arguments, and perform actions such as sending embeds, assigning or removing roles, adding reactions, or replying with dynamic content.

They are the most powerful utility tool in exceed — anything from a ,rules command to a multi-step, role-gated workflow.

Setting up custom commands (dashboard)

Open the Custom Commands page on the dashboard. Toggle the feature on, then create commands with a name, trigger, and a script body. The manager also surfaces your server's roles and channels so you can wire them into actions.

Note: The Custom Commands feature is off by default. Enable it on the dashboard before your commands will run.

The Script API

Custom command scripts have their own mini-language with variables, conditionals, loops, and a library of actions. That reference is large and lives on its own page:

Custom Commands Script API

Head there for the full list of available variables, control-flow syntax, and every action you can call, with examples.

Last.fm and live data tokens

Standard custom commands can use a few extra {variable} tokens that resolve live data when the command runs. They work in the response text and in actions, just like {user.*} and the other built-in variables.

Last.fm

{lastfm.*} is auto-filled from the command runner's linked Last.fm account. The member must link Last.fm with the bot's lastfm command first.

  • {lastfm.user}: their Last.fm username
  • {lastfm.url}: their profile URL
  • {lastfm.track}: current or last track name
  • {lastfm.artist}: that track's artist
  • {lastfm.album}: that track's album
  • {lastfm.image}: album art URL
  • {lastfm.nowplaying}: true or false
  • {lastfm.status}: Now playing or Last played
  • {lastfm.scrobbles}: total scrobbles
  • {lastfm.topartist}: their number one artist
  • {lastfm.toptrack}: their number one track

A simple now-playing command:

{lastfm.status}: {lastfm.track} by {lastfm.artist}
Scrobbles: {lastfm.scrobbles}

External lookups

These tokens take arguments after a colon and pull from outside services. Results are cached for about a minute, and any lookup that fails renders an empty string.

Crypto

  • {crypto:<coin>}: USD price, e.g. {crypto:bitcoin} or {crypto:eth}
  • {crypto:<coin>:change}: 24h percent change
  • {crypto:<coin>:marketcap}: market cap in USD

Currency

  • {currency:<amount>:<from>:<to>}: currency conversion, e.g. {currency:100:USD:EUR}

Minecraft

  • {minecraft:<name>}: the player's UUID
  • {minecraft:<name>:name}: the player's current name
  • {minecraft:<name>:avatar}: avatar image URL
  • {minecraft:<name>:skin}: skin image URL
  • {minecraft:<name>:body}: body render image URL

Weather

  • {weather:<city>}: short summary like 19.5°C in London
  • {weather:<city>:temp}: temperature
  • {weather:<city>:humidity}: humidity
  • {weather:<city>:wind}: wind speed
  • {weather:<city>:city}: resolved city name

GitHub

  • {github:<user>}: follower count, e.g. {github:torvalds}
  • {github:<user>:repos}: public repo count
  • {github:<user>:name}: display name
  • {github:<user>:bio}: profile bio
  • {github:<user>:avatar}: avatar image URL
  • {github:<user>:url}: profile URL
  • {github:<owner>/<repo>}: star count, e.g. {github:facebook/react}
  • {github:<owner>/<repo>:forks}: fork count
  • {github:<owner>/<repo>:language}: primary language
  • {github:<owner>/<repo>:issues}: open issue count
  • {github:<owner>/<repo>:description}: repo description
  • {github:<owner>/<repo>:url}: repo URL

Pokemon

  • {pokemon:<name>}: name and types, e.g. {pokemon:pikachu}
  • {pokemon:<name>:id}: Pokedex number
  • {pokemon:<name>:types}: type list
  • {pokemon:<name>:height}: height
  • {pokemon:<name>:weight}: weight
  • {pokemon:<name>:sprite}: sprite image URL

Reference

  • {dictionary:<word>}: first definition (alias {define:<word>})
  • {urban:<term>}: top Urban Dictionary definition
  • {npm:<package>}: latest version, e.g. {npm:react}
  • {npm:<package>:description}: package description
  • {npm:<package>:license}: package license
  • {npm:<package>:homepage}: package homepage URL

A price command:

Bitcoin is at ${crypto:bitcoin} ({crypto:bitcoin:change}% today).

No-argument tokens

These take no arguments at all. Drop the bare token in and it resolves on each run. They refresh quickly rather than caching for a minute, and still render an empty string if the lookup fails.

  • {advice}: a random piece of advice
  • {joke}: a random safe joke
  • {cat}: a random cat image URL
  • {dog}: a random dog image URL
  • For automatic canned replies with no command name, use Autoresponders.
  • For rich message templates and a live preview, use the Embed Builder.
  • For trigger/action workflows, see the Automations page on the dashboard.