Documentation
From your first command to parameters, conditions and lists. Read it top to bottom once; after that, the Reference and Recipes are what you'll come back to.
What custom commands are
A custom command is a reply you design on this dashboard: some text, up to 10 embeds, or both. When someone runs it, Sirius sends that reply, filling in live data like the current arbitration or the name of whoever ran it.
The message
What gets sent: text and embeds.
Placeholders
Words in {braces} that are replaced with real data when it runs.
Parameters
Values people give when they run it: a user, an item, a choice…
Logic
Show things only in some cases, and repeat things for every entry of a list.
Hey {user.mention}! Arbitration is on {arbitration.node} ({arbitration.tier} tier), ends {arbitration.ends}.Commands are made per server (anyone with dashboard access to it) or bot-wide by the bot owner (they work in every server and in DMs). If a server has a command with the same name as a bot-wide one, the server's wins there.
Your first command
- Open your server → Commands → New command. You can start from a template (Sortie, Fissures, Baro…) or from scratch.
- Name it. Lowercase, no spaces, e.g.
arby. The description shows in Discord's command list. - Write the message in Message text and/or the embed. Click in any box to insert a placeholder.
- Check the preview on the right. It's made by the bot itself with live data, so it's exactly what Discord will get.
- Publish. Until then it's only a draft (autosaved). After publishing, run
/c name:arbyin Discord.
How people run them
| Way | What they do | Notes |
|---|---|---|
/c name:arby | Pick the command in /c's list (it autocompletes). | Always available. |
| Pop-up form | If the command has parameters, /c opens a form asking for them. | Up to 5 parameters. |
/c name:price text:rhino | Type the value straight into /c's text option. | Only when the command has exactly one text-like parameter. |
/arby | A real slash command, with real options. | Needs Real slash command turned on. Up to 10 parameters. |
Functions: When · Only if · Do
Every command is a function: When something happens (someone runs the command) → Only if some checks pass → Do some steps, in order. A plain command is just one step: “Send a message”. Add more steps to post in another channel too, show one of Sirius's own embeds, react, or clean up after a while.
When
What starts it: Command (someone runs /c name, or its own slash command), Message sent (someone sends a message (in some channels, with some text or files)), Schedule (at set times: daily, some weekdays, or every n minutes), Button or menu (someone presses a function's button (or picks a menu option)), Member (someone joins, leaves, gets or loses a role), Reaction added (someone reacts to a message (reaction roles, polls…)), Warframe event (when something changes in the game (new sortie, baro, a fissure…)).
Only if
Checks that must all pass first: roles, channels, a cooldown, a Discord permission or any condition.
Do
Up to 15 steps. Each one can have its own “only if”, and later steps can use what earlier ones did.
Run log
The editor shows the last runs: what it did, or exactly what went wrong.
Later steps read earlier steps' results as {steps.name.result}, where the name is the step's name
(shown on its header, like send). For example {steps.send.link} is a link to the message step “send” sent.
Triggers
| When | Options | Placeholders it adds |
|---|---|---|
| Command | Name, description, parameters, real slash command. | {user}, {channel}, your parameters. |
| Message sent | Channels or categories (none = all), its text (contains / starts with / is exactly / a regex pattern), what it must have (an image, a file, a link, text only). Bot messages never start it. | {message} The message's text{message.content} The message's text{message.words} How many words it has{message.author} Who sent it (display name){message.author_mention} Pings who sent it{message.link} A link to the message{message.first_link} The first link in it{message.image} The first image's URL{message.images} How many images it has{message.files} How many files it has{message.has_image} “yes” if it has an image{message.has_link} “yes” if it has a link{message.is_reply} “yes” if it's a reply{message.id} The message's ID |
| Schedule | Every day at a time, some days of the week, or every N minutes (at least 5), in the server's timezone (Settings) or its own. Missed runs while Sirius was offline are skipped. Posts in the channel you pick. | {run.count} how many times it has run, {run.next}, {run.timezone} |
| Warframe event | New sortie, New Archon Hunt, Baro arrives, Baro leaves, New fissure, Arbitration changes, Cycle changes, New Nightwave challenges, Invasion with a reward, Weekly reset, Tracked item available. Filters where they make sense (fissure tiers / missions / Steel Path / storms, arbitration tiers, the open world and its state…). Only things that are new start it - one run each, at most 5 at a time. | {event.…}: the thing that happened (its fields are listed in the editor for each event) |
| Button or menu | No options: a button on any function's message with the action Run a function starts it. Replies can be private. | {clicker}, {clicker.mention}, {button}, {button.message_link} |
| Member | Someone joins, leaves, gets or loses a role (pick which roles). Posts in the channel you pick, or DMs them. Needs the Server Members intent. | {member}, {member.mention}, {member.count},
{member.account_age}, {role}… |
| Reaction added | Someone reacts: in some channels, with one emoji, on one message (paste its link) - reaction roles. | {reaction.emoji}, {reaction.message_link}, {user} |
Buttons & role menus
A Send a message step can have up to 5 buttons and a role menu. A button can run a function (from the Buttons group),
give / take a role, count (+1 into {vars.name}), open Sirius's own Set reminder / Set tracker,
or open a link. Buttons can have a cooldown per person. They keep working after Sirius restarts.
Variables: the Set a variable step (and counter buttons) remember a value per server; use it anywhere as {vars.name}.
Checks (Only if)
Checks run top to bottom; the first one that fails stops the function. Each check has an Otherwise: stop quietly, or stop and reply with a short text only they can see (a DM for message functions; leave it empty for a sensible default). Message functions can also delete their message - the riven-channel template does exactly that for anything that isn't a screenshot.
| Check | What it does |
|---|---|
| Has roles | Only people with (or without) some roles |
| In channels | Only in (or not in) some channels or categories |
| Cooldown | Wait between uses, per person, channel or server |
| Discord permission | Only people with a Discord permission |
| Condition | Any condition over the data, like arbitration.tier in "S,A" |
| Message has | Only messages with an image, a file, a link or some text |
| Max runs | At most N runs per person, channel or server in some hours |
Steps (Do)
| Step | What it does | Results for later steps |
|---|---|---|
| Send a message | Text and embeds with placeholders, situations and conditions | {steps.name.message_id} the message's ID{steps.name.link} a link to the message{steps.name.situation} which situation was sent (0 = the default message) |
| Send a built-in embed | Sirius's own /arbitration, /sortie, /baro… embed, with your changes | {steps.name.message_id} the message's ID{steps.name.link} a link to the message{steps.name.title} the embed's title |
| Grade a riven | Read a riven screenshot and post the grade picture (like /grade) | {steps.name.found} “yes” if a riven was read{steps.name.weapon} the weapon{steps.name.grades} each stat's grade{steps.name.best} the first stat's grade{steps.name.rank} the riven's rank{steps.name.count} how many cards were graded{steps.name.message_id} the grade message's ID{steps.name.link} a link to it |
| Delete a message | Delete the triggering message or one an earlier step sent, now or after a delay | {steps.name.deleted} “yes”, or “later” with a delay |
| Add a reaction | React with an emoji to the triggering message or one an earlier step sent | — |
| Stop | End the run here (give it an “only if” to stop only sometimes) | — |
| Give a role | Give roles to the person who started it | {steps.name.changed} “yes” if a role was given |
| Take a role | Take roles from the person who started it | {steps.name.changed} “yes” if a role was taken |
| Pin a message | Pin their message or one an earlier step sent | — |
| Start a thread | Start a thread on their message or one an earlier step sent | {steps.name.name} the thread's name{steps.name.link} a link to it |
| Wait | Pause before the next step (up to 15 minutes) | — |
| Set a variable | Remember a value or count up, per server: {vars.name} anywhere | {steps.name.value} the new value |
| Show a build | Post a build from /build (compare two, or check for a mod) | {steps.name.found} “yes” if the build exists{steps.name.name} the build's name{steps.name.item} what it's for{steps.name.mods} its mods{steps.name.has} “yes” if it uses the mod you asked about{steps.name.added} compare: what the second build adds{steps.name.removed} compare: what it leaves out |
Where a message goes: Reply · Reply only they can see · Same channel · A chosen channel · DM them. “Reply only they can see” works for commands. A function sends at most 5 messages per run, and a server can have up to 50 functions.
Builds (/build)
The Builds tab of a server keeps its loadouts: what the build is for, the aura or stance, exilus, up to 8 mods (with ranks), arcanes and archon shards, plus notes, other names and tags. People pull them up in Discord with:
| Command | What it does |
|---|---|
/build show | The build as a picture (or the picture link you gave it). |
/build compare | What the second build adds and leaves out compared with the first. |
/build has | Whether a build uses a mod or arcane. |
The editor suggests warframes, weapons, mods and arcanes from the game data and checks the build as you type: mods that don't fit, exilus-only mods, the same mod twice, capacity (a rank-30 item with a reactor or catalyst, plus the aura's bonus). The checks are notes - they never stop you saving. Bot-wide builds work in every server; a server's own build with the same name replaces it there.
Functions can use builds too: the Show a build step posts one, compares two, or only looks one up so later steps can use
{steps.build.found}, {steps.build.mods} or {steps.build.has}.
Text & embeds
A reply can have message text (normal chat text) and up to 10 embeds (the boxes with a coloured stripe).
Both support Discord markdown: **bold**, *italic*, [link](https://…),
`code`, > quote, # heading.
| Embed part | What it is |
|---|---|
| Colour | The stripe on the left. Pick one, or take it from a placeholder like {boss.color}. |
| Author | Small line at the top, with an optional icon and link. |
| Title · Title link | Bold title; with a link it becomes clickable. |
| Description | The main text. |
| Fields | Name + value pairs. Inline fields sit side by side (up to 3 per row). |
| Thumbnail · Big image | Small picture top-right · large picture at the bottom. Must be an https:// link (or a placeholder that gives one). |
| Footer · timestamp | Small text at the bottom, and optionally the time it was sent. |
| Own message text | Text that replaces the normal message text whenever this embed is shown. See Show things only sometimes. |
Only visible to them (on the command) makes the reply ephemeral: only the person who ran it sees it. The ⧉ button on an embed duplicates it.
Placeholders
A placeholder is a name in braces. When the command runs, it's replaced with a value.
- Dots go deeper:
{user}is a name,{user.mention}pings them,{user.avatar}is their picture. - Unknown names stay as written.
{usr}is sent as the text "{usr}", so a typo is visible. The editor lists unknown names under the preview. - Times like
{sortie.ends}are Discord timestamps: everyone sees them in their own timezone.
You don't need to memorise names: the button and the Placeholders panel in the editor list everything available, including your parameters. The full list is in the Reference.
{user} checked the sortie: {sortie.boss}, ends {sortie.ends}.Filters
Filters change how a value looks. Add them inside the braces after a |. You can chain several; they
run left to right. Some take a setting after a colon: text goes in quotes.
{target.name | upper}
{amount | default: "1"}
{price | number} platinum
{name | trim | title}| Filter | Does |
|---|---|
| default | value to use when it's empty |
| upper | UPPERCASE |
| lower | lowercase |
| title | Title Case |
| capitalize | First letter capital |
| trim | remove spaces around it |
| truncate | cut to N characters |
| round | round a number to N decimals |
| number | 1234567 -> 1,234,567 |
| length | how many characters / entries |
| yesno | true/false -> "Yes,No" (or your own words) |
| plural | 3 -> "3 items" with plural: "item,items" |
| join | a list as text: join: ", " (or "\n" for lines) |
| url | make it safe inside a link |
| wiki | name -> [name](its wiki page) |
| link | make it a link: link: some.url |
| code | wrap in `code` |
| bold | wrap in **bold** |
Parameter basics
A parameter is a question the command asks when it runs: who?, which item?, which boss?.
Its name becomes a placeholder: a parameter called target gives {target},
{target.mention} and more, depending on its type.
| Setting | What it does |
|---|---|
| Name | Lowercase letters, numbers and _. Can't be a built-in name
(arbitration, archon, baro, cetus, channel, circuit, clicker, coda, command, date, event, input, now, param, server, sortie, steps, time, timestamp, user, vallis, vars), so {user} always means the person who ran it. |
| Type | What kind of value it is: text, number, user, item… See Parameter types. |
| Description | Shown to people in the form / slash command, e.g. "Who gets the hug". |
| Required | On: they can't run the command without it. Off: they can leave it empty. |
| If they leave it empty, use | Only for optional parameters: a fallback value used when it's left empty. |
Every parameter also gives {name.given}: yes when the person filled it in themselves,
empty when they didn't (even if a fallback was used). Use it to react to "nothing picked"; see
Show things only sometimes.
Parameter types
The type decides what people enter and which placeholders you get. p below stands for your parameter's name.
Text
Any text they type- People enter
- A text box.
- Settings
- Minimum / maximum length, fallback value.
- Placeholders
{p}what they typed{p.length}how many characters{p.given}they filled it in
You said: {msg}Whole number
1, 2, 30…- People enter
- A text box that only accepts whole numbers.
- Settings
- Minimum / maximum, fallback value.
- Placeholders
{p}the number{p.given}they filled it in
{amount} × 20 = {if amount > 5}a lot{else}not much{end}Number
Decimals allowed: 2.5- People enter
- A text box for numbers; 2.5 and 2,5 both work.
- Settings
- Minimum / maximum, fallback value.
- Placeholders
{p}the number{p.given}they filled it in
{hours | round: 1} hoursYes / No
A true/false switch- People enter
- A Yes / No dropdown (a true/false option as a slash command).
- Settings
- Fallback value.
- Placeholders
{p}yes or no{p.given}they filled it in
{if loud}**{msg | upper}**{else}{msg}{end}Choice
Pick from your own list- People enter
- A dropdown with your options (up to 25).
- Settings
- Options with a label, an optional value and extra columns; fallback value.
- Placeholders
{p}the chosen label{p.label}the chosen label{p.value}its value{p.given}they filled it in
{boss} drops {boss.shard} shardsLong list
Autocomplete from rows you paste in (up to 500)- People enter
- A text box; as a slash command it autocompletes from your rows (up to 500).
- Settings
- Rows (label, optional value, extra columns), Allow any text, fallback value.
- Placeholders
{p}the chosen label{p.label}the chosen label{p.value}its value{p.found}yes if it matched a row{p.given}they filled it in
{build}: {build.note}User
A member of the server- People enter
- A member picker.
- Settings
- Empty = themselves (use the person running it when nobody is picked).
- Placeholders
{p}display name{p.name}display name{p.mention}pings them{p.username}@username{p.id}user ID{p.avatar}avatar image URL{p.joined}when they joined the server{p.created}account age{p.color}role colour (#hex){p.top_role}highest role{p.given}they filled it in
{user} hugs {target.mention}!Role
A server role- People enter
- A role picker.
- Settings
- —
- Placeholders
{p}role name{p.name}role name{p.mention}pings the role*{p.id}role ID{p.color}colour (#hex){p.members}member count{p.given}they filled it in
{role} has {role.members} membersChannel
A server channel- People enter
- A channel picker.
- Settings
- —
- Placeholders
{p}#name{p.name}name{p.mention}clickable link{p.id}channel ID{p.given}they filled it in
Moved to {where.mention}Warframe item
Any item, with autocomplete- People enter
- A text box; as a slash command it autocompletes from every Warframe item.
- Settings
- Only certain kinds of items (Warframes, Mods…), fallback value.
- Placeholders
{p}item name{p.name}item name{p.link}name linked to the wiki{p.wiki}wiki URL{p.category}Warframe, Mod, Primary…{p.description}short description{p.tradable}Yes / No{p.image}picture (wiki){p.market}warframe.market URL{p.price}lowest sell price{p.price_max}lowest sell, maxed rank{p.buy}top buy price{p.avg}average trade price{p.volume}trades lately{p.ducats}ducat value{p.rarity}rarity{p.max_rank}max rank{p.vaulted}Yes / No{p.given}they filled it in
{it.name}: {it.price | default: "not tradable"}Star chart node
A mission node, with autocomplete- People enter
- A text box; as a slash command it autocompletes from the star chart.
- Settings
- Fallback value.
- Placeholders
{p}node name{p.name}node name{p.planet}planet{p.tier}arbitration tier{p.tier_emoji}tier emoji{p.link}name linked to arbi.guide{p.tileset}arbi.guide URL{p.mission}mission type{p.faction}enemy faction{p.next}next time it's an arbitration{p.given}they filled it in
{node} is {node.tier} tier, next arbitration {node.next}File
An uploaded file or image- People enter
- A file upload.
- Settings
- Images only.
- Placeholders
{p}file URL{p.url}file URL{p.name}file name{p.size}size in KB{p.image}yes if it's an image{p.given}they filled it in
Image: {pic.url}Choice & Long list
Both let people pick from a list you write. The difference is size and how they pick:
| Choice | Long list | |
|---|---|---|
| How many | Up to 25 | Up to 500 |
| How people pick | A dropdown | Typing, with autocomplete suggestions |
| Anything not in the list? | No | Only with Allow any text on |
| Good for | A few fixed options (bosses, modes) | Many entries (builds, guides, a glossary) |
Each row has three parts
| Label | What people see and type. {p} and {p.label} show it. |
| Value | Optional short ID, e.g. saryn. Handy in conditions because it never changes even if you rename the label: p.value == "saryn". If empty, it's the same as the label. |
| Extra columns | Your own data per row. Add a column called image, fill it in per row, and {p.image} gives the right picture for whatever was picked. Up to 10 columns. |
Title: {build}
Description: {build.note}
Big image: {build.image}Filling it in quickly
Use Paste many rows at once: one row per line, parts separated by |, in this order:
Label | value | column 1 | column 2…. Tabs work too, so you can copy cells straight from a spreadsheet.
Saryn Prime | saryn | Spores build | https://…/saryn.png
Mesa Prime | mesa | Peacemaker | https://…/mesa.png
Rhino Prime | | Tank | https://…/rhino.png
Allow any text (Long list)
Normally, text that isn't one of the rows is refused with "Couldn't find…". With Allow any text on, it's
accepted as it is: {p} is what they typed, the extra columns are empty, and {p.found} tells
you which case you're in (yes = it matched a row).
{if build.found}{build}: {build.note}{else}No build called “{build}” yet.{end}Conditions
A condition is a yes/no question like "was a target picked?" or "is the boss Nira?". They're used by every tool in the next section. In conditions you write names without braces.
| Write | Means |
|---|---|
target.given | it has a value (anything except empty, "no", "false" or 0) |
not baro.here | the opposite |
boss.value == "nira" · != | is / is not (upper and lower case don't matter) |
amount > 5 · < · >= · <= | compare numbers |
it.name contains "Prime" | the text contains it |
startswith · endswith | the text starts / ends with it |
boss.value in "nira,boreal" | is one of these |
a and b · a or b · ( … ) | combine; brackets group |
Show things only sometimes
There are four tools, from smallest to biggest. All of them use a condition.
| You want to… | Use | Where |
|---|---|---|
| change a few words in a text | {if} … {end} | inside any text box |
| hide or show one field | Only show it if… | field → Repeat / show only if |
| hide or show a whole embed | Only show this embed if… | top of the embed |
| change the message text together with an embed | Own message text | top of the embed |
| send a completely different message | Situation | the Messages card → + Situation |
{if} in text
Write {if condition}, the text, and {end}. Optionally add {elif another condition}
and {else} in between.
{if target.given}Hey {target.mention}!{else}Hey everyone!{end}
That is {if amount > 10}a lot{elif amount > 1}a few{else}just one{end}.Only show a field / an embed
Write the condition in the box; when it's false, the field or embed is left out. Example: an embed with
Only show this embed if… set to boss.value == "nira" only appears when Nira was picked.
Tip: a field whose value comes out empty is left out automatically, so often you don't even need a condition.
Own message text (an embed's text)
Turn on Own message text in an embed and write a text there. Whenever that embed is shown, its text is sent
instead of the normal message text, so the two come as a pack. Combined with Only show this embed if…
this is how you condition the message text: e.g. an embed shown only when boss.value == "nira" can bring
its own "Nira is up!" text. If several shown embeds have their own text, the first one wins. An embed can even be
just a text (no title or fields) to act as a conditional message.
Situations
A situation is a whole other message (its own text and embeds) plus a condition. When the command runs, situations are checked left to right and the first one whose condition is true is sent. If none match, the Default message is sent. Up to 10 per command.
| Situation | Condition |
|---|---|
| Baro is away | not baro.here |
| Nobody was picked | not target.given |
| No sortie right now | not sortie.active |
| A top-tier arbitration | arbitration.tier_rank >= 5 |
Tip: Copy the default message here starts a situation from what you already have.
Lists & loops
Some data is a list: the fissures open right now, the sortie's 3 missions, Baro's inventory. To show a list,
write the part for one entry once, between {each x in list} and {end}. It's repeated for every
entry, and x (any name you like) is the current entry.
{each m in sortie.missions}{loop.index}. {m.node} — {m.type}
{end}Which fields an entry has (node, type…) is listed in Warframe data.
Put {else} inside to say something when the list is empty.
Picking and ordering entries
Add options after the list name, each after a |:
| where: f.steel_path | keep only entries where the condition is true (you can add several) |
| sort: f.tier_num | sort by a field; -f.tier_num sorts the other way |
| limit: 5 · | skip: 2 · | reverse | only the first 5 · skip the first 2 · reverse the order |
| group: f.tier | group entries that share a value. Each group is {g} (the shared value) with {g.count} and a list g.items. |
{each f in fissures | where: f.steel_path | sort: f.tier_num | limit: 3}{f.tier} {f.node} — {f.mission}
{else}No Steel Path fissures.{end}Handy extras
{loop.index} | inside a loop: 1, 2, 3… |
{loop.first} · {loop.last} | inside a loop: "yes" on the first / last entry, e.g. {if not loop.last}, {end} for commas |
{fissures.count} | how many entries (no loop needed) |
{fissures.first.node} · {fissures.2} | a single entry (numbers start at 1) |
{circuit.warframes | join: ", "} | the whole list as one line of text |
Repeating fields
Instead of a loop inside one field, you can make one field per entry. Open a field → Repeat / show only if
and fill in Repeat this field for each… with x in list. Use {x…} in the field's name and value.
Repeat for each: m in sortie.missions
Field name: {loop.index}. {m.node}
Field value: {m.type}The list options work here too, e.g. g in fissures | group: g.tier makes one field per relic tier.
Preview & testing
- Live preview is made by the bot with the same code it uses in Discord. Turn Live data off to see your raw template.
- Test values are pretend answers for your parameters, only for the preview. Change them to check every case.
- Under the preview, notes tell you about unknown placeholders, missing test values, and which situation your test values pick.
- Send a test posts what's in the editor to a channel, published or not.
Drafts & publishing
- Your work is autosaved as a draft a few seconds after you stop typing, even if it has errors. Save draft saves right away.
- Publish checks everything and makes it live in Discord. If something's wrong, the problems are listed and your work stays in the draft.
- Editing a live command doesn't change Discord until you publish; the list shows Unpublished changes. Discard changes goes back to the live version.
- New commands that were never published are listed under Drafts on the Commands page.
- History (in the editor's side panel) keeps the last 25 published versions and what changed in each. Restore puts an old version back in the editor as unpublished changes - publish it to make it live again.
- Export / import on the Functions page downloads every function as a file, or reads one back in (from a backup or another server). Imported functions come in as drafts, so nothing goes live until you check their channels and roles and publish them.
Slash commands & access
- Real slash command also registers the command as its own
/name, with real options. Server administrators can turn it on for their server's commands (only that server gets it); only the bot owner can for bot-wide ones. - It can't use the name of one of Sirius's own commands. Discord can take a moment to show a new slash command.
- Who can edit: the server's administrators, plus roles they allow on the Access tab.
- Replies can ping users, but never
@everyone,@hereor roles.
All placeholders
Always available, in every command. Your parameters add their own (see Parameter types).
You & the server
{user} | Their display name |
{user.mention} | Pings them |
{user.username} | Their @username |
{user.id} | Their user ID |
{user.avatar} | Their avatar (image URL) |
{server} | Server name |
{server.members} | Member count |
{server.icon} | Server icon (image URL) |
{server.id} | Server ID |
{channel} | Channel name |
{channel.mention} | Channel link |
{input} | Text they typed after the command |
Time
{date} | Today's date (their timezone) |
{time} | Current time (their timezone) |
{now} | Date and time |
{timestamp} | Unix timestamp |
Arbitration
{arbitration.node} | Current node |
{arbitration.mission} | Mission type |
{arbitration.faction} | Enemy faction |
{arbitration.tier} | Tier letter (S-F) |
{arbitration.tier_emoji} | Tier emoji |
{arbitration.ends} | When it ends |
{arbitration.link} | arbi.guide tileset page |
{arbitration.next} | Next hour's node |
Sortie
{sortie.boss} | Sortie boss |
{sortie.faction} | Sortie faction |
{sortie.ends} | When it resets |
Archon Hunt
{archon.boss} | This week's Archon |
{archon.shard} | Shard colour it drops |
{archon.next} | Next week's Archon |
{archon.ends} | When it resets |
Baro Ki'Teer
{baro.status} | In town / away |
{baro.location} | Relay he's at (or going to) |
{baro.arrives} | When he arrives |
{baro.leaves} | When he leaves |
Cycles
{cetus.state} | Day / Night on the Plains |
{cetus.ends} | When it changes |
{vallis.state} | Warm / Cold in Orb Vallis |
{vallis.ends} | When it changes |
Circuit & Coda
{circuit.warframes} | This week's Circuit Warframes |
{circuit.incarnons} | This week's Incarnon adapters |
{coda.batch} | Eleanor's Coda batch (A/B) |
{coda.weapons} | Coda weapons on sale |
{coda.ends} | When the batch switches |
Warframe data
More data you can read, updated live. list means it has several entries: use it with
{each}; the last column is what each entry has.
Arbitration
| Name | What it is | Each entry has |
|---|---|---|
arbitration.upcoming list | next 24 hours | node, mission, faction, tier, tier_rank, tier_emoji, link, tileset, day, date, starts, starts_time, ends |
arbitration.days list | next 7 days (each has .arbitrations) | day, date, arbitrations |
arbitration.tier_rank | S=6 A=5 B=4 C=3 D=2 F=1 | — |
Sortie
| Name | What it is | Each entry has |
|---|---|---|
sortie.active | yes while there's a sortie | — |
sortie.missions list | the 3 missions | node, type, modifier, modifier_info, number |
Archon Hunt
| Name | What it is | Each entry has |
|---|---|---|
archon.missions list | the 3 missions | node, type |
archon.shard_emoji | shard emoji | — |
archon.image | shard picture (URL) | — |
archon.color | shard colour (#hex) | — |
Fissures
| Name | What it is | Each entry has |
|---|---|---|
fissures list | active fissures, sorted by tier | node, mission, tier, tier_num, enemy, steel_path, storm, ends, ends_time, ends_date, ends_unix |
Invasions
| Name | What it is | Each entry has |
|---|---|---|
invasions list | active invasions | node, desc, attacker, defender, attacker_reward, defender_reward, progress |
Nightwave
| Name | What it is | Each entry has |
|---|---|---|
nightwave | season name | — |
nightwave.challenges list | this week's challenges | title, desc, standing, kind, daily, weekly, elite, ends, ends_time, ends_date, ends_unix |
Bounties
| Name | What it is | Each entry has |
|---|---|---|
bounties list | one entry per syndicate | syndicate, jobs (type, levels, rewards, standing, vault), ends, ends_time, ends_date, ends_unix |
Baro Ki'Teer
| Name | What it is | Each entry has |
|---|---|---|
baro.here | yes while he's in a relay | — |
baro.inventory list | what he sells (while here) | item, ducats, credits |
Steel Path
| Name | What it is | Each entry has |
|---|---|---|
steelpath | Teshin's current reward | — |
steelpath.rotation list | Teshin's full rotation | name, cost |
Cycles
| Name | What it is | Each entry has |
|---|---|---|
cambion.state | Fass / Vome | — |
zariman.state | Grineer / Corpus | — |
earth.state | Day / Night | — |
duviri.state | Duviri spiral mood | — |
Circuit & Coda
| Name | What it is | Each entry has |
|---|---|---|
circuit.warframes list | this week's Warframes (list) | name, link |
circuit.incarnons list | this week's Incarnons (list) | name, link |
circuit.warframe_weeks list | every week of the rotation | week, current, choices, starts |
circuit.incarnon_weeks list | every week of the rotation | week, current, choices, starts |
coda.weapons list | on sale now (list) | name, link |
coda.next_weapons list | next batch (list) | name, link |
Sirius
| Name | What it is | Each entry has |
|---|---|---|
bot.logo | Sirius logo (URL) | — |
bot.avatar | the bot's avatar (URL) | — |
bot.mention | pings the bot | — |
asset.NAME | a picture from the bot's assets folder | — |
emoji.NAME | one of the bot's emojis, e.g. emoji.Sirius_Clock | — |
Times come in four forms: ends ("in 2 hours"), ends_time ("18:00"), ends_date
(full date) and ends_unix (a number, for sorting and comparing).
Emojis & pictures
{ping.ROLE} | Pings a role of this server, e.g. {ping.arbi_ping} for “Arbi Ping” (lowercase, spaces become _). The editor lists them under Placeholders → Ping a role. Only roles in your own text ping - mentions people type never do, and @everyone never does. The role must be mentionable, or Sirius needs “Mention @everyone, @here and All Roles”. |
{emoji.NAME} | One of the bot's emojis, e.g. {emoji.Sirius_Clock}. Works in any text. |
{asset.NAME} | A picture from the bot as a link, e.g. {asset.TauAmber}. For image, thumbnail and icon boxes. |
{bot.logo} · {bot.avatar} | Sirius's logo / avatar. |
The editor's placeholder panel lists every emoji and picture available.
Limits & auto-fit
Discord's limits apply to what's sent (after placeholders and loops are filled in). Sirius fits it for you:
| Message text | 2000 characters (cut with …) |
| Embeds | 10 per message, 6000 characters all together |
| Title · description | 256 · 4096 characters |
| Fields | 25 per embed. Values over 1024 characters continue in extra fields; past 25 the last one says "…and N more". |
| Loops | 100 entries per loop, 3000 steps per message. |
| Parameters | 5 with /c's form, 10 as a real slash command. |
Recipes
Show an embed only when a parameter has a certain value
- Add the parameter, e.g. a Choice called
bosswith the options Amar, Nira and Boreal. - In the embed, find Only show this embed if… and click its ✨ button.
- Pick {boss} → is → Nira, then Use it. It writes
boss.value == "nira".
Variations: several values boss.value in "nira,boreal" · a Long list row build.value == "saryn" ·
anything picked boss.given · typed text that isn't a row not build.found.
Change a colour, picture or word depending on the choice
Give the Choice extra columns, e.g. color, image and shard, fill them per option, then:
Colour from a placeholder: {boss.color}
Thumbnail: {boss.image}
Title: {boss} drops {boss.shard} shards
Something different when nobody is picked
Small difference: {if target.given}{target.mention}{else}everyone{end}. Whole other message: a situation
with not target.given. Or turn on Empty = themselves on the User parameter.
A build lookup
Long list build with columns note and image. Paste your builds
(Saryn Prime | saryn | Spores build | https://…png). Embed title {build}, description
{build.note}, big image {build.image}. Turn on Allow any text and add a situation with
not build.found to answer nicely when a build doesn't exist.
Good arbitrations for the week, one field per day
Repeat for each: d in arbitration.days
Field name: {d}
Field value: {each a in d.arbitrations | where: a.tier_rank >= 4}{a.starts_time} {a.tier_emoji} {a.node}
{else}nothing B+{end}
Price check
Item parameter it. Title {it.name}, title link {it.wiki}, thumbnail {it.image}, and:
{if it.tradable == "Yes"}Lowest sell: **{it.price | default: "none online"}**{else}Not tradable.{end}
Templates
Every template on the New command page is a complete, working example; several rebuild Sirius's own commands:
Troubleshooting
- A placeholder shows up as
{something}in Discord. - That name doesn't exist (a typo, or a parameter that was renamed). The preview lists unknown names. If it may be
missing on purpose, add
| default: "…". - A field or embed is missing.
- Its value came out empty (an empty list, or an
{if}that was false), or its "only show if" condition is false. - "Couldn't find … for build".
- The Long list has no such row. Add it, or turn on Allow any text.
- My condition does nothing.
- Conditions use names without braces (
target.given, not{target.given}). For choices, compare.value:boss.value == "nira". The ✨ button writes it for you. - The preview shows a different message than the tab I'm editing.
- The note under the preview says which situation your test values pick; change the test values or open that tab.
- I can't publish.
- The errors are listed at the top of the editor. Your work is safe in the draft meanwhile.
