PenguinMod Ember blocks
Ember is the chat part of Nookara. Every Ember server is its own community with its own address. The Nookara extension lets a PenguinMod or TurboWarp project sign in to any of them, read channels, send and react to messages, and post through webhooks, using the account the player already has.
https://ikelene.net/gallery/extensions/velora_extension.js (extension id velora) with Run without sandbox turned on, because sign-in opens a popup. The blocks are in the Nookara category under the label Ember servers.In this guide
- How it works
- Block reference (searchable)
- Errors
- Migrating old projects
- Signing
- Webhooks
- Three recipes
- Permission errors in the other groups
How it works
Nookara is the identity: your account, friends, direct messages, credits and the keys that prove who wrote a message. Ember servers are separate. A server is either hosted by Nookara at SLUG-bonfire.ikelene.net, run by someone on their own domain, or the main community at https://chat.ikelene.net.
| Way to sign in | Blocks | Needs |
|---|---|---|
| Nookara login | connect to instance [URL] | The project signed in with Nookara and a permission integer that asks for Chat Messaging (2048). For example 2053 asks for Basic Profile, Project Auth and Chat Messaging. The player decides on the sign-in screen and may untick any permission, so the block can fail even when you asked (see Permissions can be declined). |
| Local account | connect ... as [USERNAME] password [PASSWORD] and register on Ember server ... | A server that keeps its own accounts. No Nookara sign-in and no scope needed. |
Every block that takes a server has a URL argument. Use the server address, for example https://chat.ikelene.net. Servers must use HTTPS; plain HTTP is accepted only for localhost. A project can be connected to several servers at once, and each block works on the one whose address you give it. All arguments are text. Channels can be given by name (a leading # is fine, case does not matter) or by channel id. The older Ember communities and channels blocks (for example send [MSG] in channel ID [CHANNEL] of server ID [SERVER]) take a server ID and a channel ID instead of an address; see Migrating old projects.
Permissions can be declined
Nothing in the permission integer is required: it is a request, and the sign-in popup lets the player untick any permission (the risky ones, such as Sign Messages, Spend Credits and Modify Settings, start unticked). A block that needs a permission the player did not allow stops with a red error that says which one and whether the project never asked for it or the player chose not to allow it. Ask only for what your project uses, show a "log in again" button that runs the sign-in block again, and let the project keep working without the optional parts. An administrator can also switch a service off for one account; then the error says it was disabled by an administrator and logging in again does not help (check ahead with administrator has paused [SERVICE]?). The server list, unread state and every other Ember feature that does not need the missing permission keep working.
- Nookara-hosted servers are read-only now. Writes to the old Nookara-hosted chat answer
server_read_only(with the new address when the server moved). Reading still works. Ember servers, including chat.ikelene.net, are not affected. - Connecting is always explicit. Nothing signs in or connects by itself: not loading a project, not a reporter, not a hat. Run
connect to instance [URL](or the local-account connect block) yourself, and wait untilconnected to [URL]?is true orwhen instance [URL] becomes [STATE]fires with connected. A block that needs a server you are not connected to stops withnot connected to URL: use the connect block. - Sessions are never saved in projects. A project file remembers only the server addresses, never a token or a password. After loading a project, sign in to Nookara again and run the connect block for each server.
- The project handles reconnects. If the live connection drops, the extension does not retry. Watch
when instance [URL] becomes [STATE](states: connecting, connected, disconnected, error), readinstance [URL] connection stateandinstance [URL] last connection error, and run the connect block again when you want to try (for example after a short wait). A joined community that needs approval stays pending until a moderator accepts you. - Several blocks end up in the shared reporters
latest operation response as JSONandlatest operation completed successfully?(Verbose group). Sign-in responses are never put there.
Block reference
Every visible block of the Nookara extension (version 1.9.6), drawn the way it looks in the palette, with the default value of each input. Round slots take text or numbers, slots with an arrow are menus. The tags show the permission (scope) the block checks before it does anything, taken from the extension itself. If a block is missing in your project, reload the extension: older projects keep the version they loaded.
Connection 4
Whether the Nookara service answers, and events for the connection opening or dropping.
Authentication 8
The sign-in popup, tokens and the result of signing in. Every other group needs the project to be signed in first.
Opens the approval popup. PERMISSIONS is the integer from the permissions calculator. Throws if the popup is blocked.
Signs in with a saved token. Throws invalid_token for a bad token.
Signs out and closes Ember sessions that used Nookara login.
The session token. Throws Not logged in. Never post it anywhere.
True while the sign-in popup is open.
True when an administrator switched that service off for the account.
Check the result of sign-in: successful or failed.
Starts when sign-in finishes.
Your Nookara Account 7
Read fields of the signed-in account. Sensitive fields need the matching scope.
One field of the account, such as username, membership, credits, badges or avatar_url.
Reports true or false.
Every available account field at once.
Whether the account is restricted.
Starts the script below it when this happens.
Profile 3
Edit the profile of the signed-in account. Needs the Modify Settings scope.
Data Storage 10
Per-player saved data for the project. Choose a storage ID first; reads need Read Storage and writes need Write Storage.
Choose the storage namespace. Without it the storage blocks throw No storage ID set.
Reports true or false.
Read one stored value.
Write one value.
Reports true or false.
Delete one entry.
Erase the whole namespace.
Storage Information 7
How much of the account storage is used.
Reports true or false.
Reports true or false.
Reports true or false.
Ember classic channel context 12
Blocks that work on the currently selected channel or room.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember communities and channels 16
Community and channel blocks that take a server ID and channel ID.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember server connections 14
Connect a project to one or several Ember servers by address, with Nookara login or a local account.
Signs in to an Ember server with your Nookara account and opens the live connection. Needs Chat Messaging. Nothing connects by itself: run it for every server your project uses.
connecting, connected, disconnected or error. The extension never retries a dropped connection; the project decides.
The last connection error text, or empty.
Runs when the connection to that server changes to the chosen state. Use it to reconnect.
For servers that have their own accounts instead of Nookara login. Needs no Nookara sign-in and no scope.
Creates a local account on a server that allows sign-ups and signs you in with it.
Closes the live connection, forgets the server for saves and ends the session on the server.
True once the live connection is up and ready. False while connecting, after a drop, or when never connected.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Ember servers: info 5
Facts about a connected server.
Reports true or false.
The community name, or the server name if there is no community yet.
Your account id on that server. Compare it with the author id of a message to ignore your own posts.
Reports JSON as text. Use the JSON blocks to read it.
Ember communities 16
Join, leave and administer the community of a server.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Reports true or false.
The member list of the community.
Reports JSON as text. Use the JSON blocks to read it.
Reports true or false.
Reports JSON as text. Use the JSON blocks to read it.
Ember invites 6
Create, inspect and use invite links.
Ember channels 7
List, find and manage channels.
Every channel of the community, each with its cid and name.
Reports JSON as text. Use the JSON blocks to read it.
Turns a channel name into its id. A leading # is fine and case does not matter.
Ember messages 28
Send, reply, edit, delete, react, pin and read messages, and react to new ones.
Posts a message. Text is cut at 4000 characters. Signed automatically when signing is allowed.
Posts a reply that points at the message with that id.
Replaces the text of one of your own messages. Keeps the reply link and attachments.
Deletes a message. The server decides whether your role may delete it.
Adds your reaction to the message.
Reports JSON as text. Use the JSON blocks to read it.
Up to the latest 100 messages of the channel.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Runs once for every new message in that channel, including your own. Read it with the last message blocks inside the script.
Starts the script below it when this happens.
Reports JSON as text. Use the JSON blocks to read it.
Text of the newest message the server delivered to you, in any channel. Empty until one arrives.
Account id of the author of the newest message (compare with my id).
Message id of the newest message. Use it with reply, edit, delete and react.
Channel id the newest message was posted in.
Ember media 4
Upload files and send them as attachments.
Ember bots 4
Manage bots of a community.
Ember JSON: invite 1
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: servers 24
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: discover 1
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: channels 13
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: join 1
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: messages 6
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: upload 1
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: bots 7
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember JSON: media 2
One block per Ember route. The result is the raw JSON described in the Nookara API guide.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Ember advanced 2
Raw API calls and webhooks.
Status & Rich Presence 9
What the player is doing, shown under their name and on their profile. Needs Chat Messaging.
TYPE is playing, listening, watching, competing, streaming or custom.
Sets a custom status text.
Reports JSON as text. Use the JSON blocks to read it.
Starts the script below it when this happens.
Nookara Events & Permissions 13
Live events, permission checks and a few helpers for the Nookara connection.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Game Servers (Minecraft) 12
Talk to a Minecraft server connected to an Ember channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Uses explicitly connected Ember instances. Use server IDs and channel IDs; unique legacy names and invite links are accepted. No automatic connections. Classic global blocks use the selected channel (join room), or a unique general channel.
Reports true or false.
CloudLink Bridges 1
Tell whether a post came through a CloudLink bridge.
Reports true or false.
Nookara API: users 1
One block per Nookara route. The result is the raw JSON described in the Nookara API guide.
Nookara API: bots 8
One block per Nookara route. The result is the raw JSON described in the Nookara API guide.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Nookara API: presence 5
One block per Nookara route. The result is the raw JSON described in the Nookara API guide.
Nookara API: dm 2
One block per Nookara route. The result is the raw JSON described in the Nookara API guide.
Nookara API: calls 1
One block per Nookara route. The result is the raw JSON described in the Nookara API guide.
Nookara API: groups 11
One block per Nookara route. The result is the raw JSON described in the Nookara API guide.
Users 7
Who is connected to the project right now.
DMs (Works offline) 15
Direct messages (Instant Messages). Reading needs Read Instant Messages, sending needs Send Instant Messages.
Sends a direct message. Reports an error if delivery times out.
Reports true or false.
Fires on incoming direct messages.
Starts the script below it when this happens.
Reports JSON as text. Use the JSON blocks to read it.
Reports true or false.
Message history with one user.
The conversation list.
Unread count over all conversations.
Marks the messages from that user as read.
Your Nookara Circle 10
Friends. Reading needs View Friends, changing needs Manage Friends.
The friends list.
Sends a friend request.
Starts the script below it when this happens.
Starts the script below it when this happens.
Currency 8
Nookara credits. Reading needs View Subscriptions, spending needs Spend Credits and always asks the player to confirm in a popup.
Your credit balance.
Asks the player to confirm, then sends credits.
Starts the script below it when this happens.
Recurring credits. PERIOD is weekly, biweekly, monthly, bimonthly or yearly.
Stops the recurring credits to that user.
Media Upload 6
Upload an image, audio or video. Needs Upload Media. MODE is wait or continue.
File Picker 5
Let the player choose a file and read it.
Login History 6
Sign-in history of the account. Needs View Sensitive Info.
Starts the script below it when this happens.
Reports JSON as text. Use the JSON blocks to read it.
User Lookup 13
Look up any user and read the result with the lookup blocks.
Starts a lookup. Read the answer with the lookup result blocks.
Reports JSON as text. Use the JSON blocks to read it.
Reports true or false.
Reports JSON as text. Use the JSON blocks to read it.
Badge Arcade 7
Arcade badges of the looked-up user.
Achievements 6
Project achievements for the signed-in account.
Reports JSON as text. Use the JSON blocks to read it.
Reports true or false.
Starts the script below it when this happens.
Reports JSON as text. Use the JSON blocks to read it.
Nookara App Alerts 7
The notification feed.
Starts the script below it when this happens.
The number on the notification bell, asked from Nookara each time (0 when signed out).
Reports JSON as text. Use the JSON blocks to read it.
Badges 5
The profile badges of the signed-in account.
Nookara Voice 26
Nookara Voice rooms and calls. Needs the Nookara Voice scope. Joining asks the browser for the microphone.
Enters a voice room. Asks the browser for the microphone.
Leaves the voice room.
Switches the microphone on or off.
Reports true or false.
Reports true or false.
Reports JSON as text. Use the JSON blocks to read it.
Reports JSON as text. Use the JSON blocks to read it.
Reports true or false.
Starts the script below it when this happens.
Starts the script below it when this happens.
Invites that user into your voice room.
Starts the script below it when this happens.
Starts the script below it when this happens.
Reports true or false.
Accept or decline an incoming call.
Verbose 2
The last response and outcome of operations that report into shared reporters. Sign-in responses are never put here.
Extension 1
The version of the extension this project loaded.
The version of the Nookara extension that is loaded.
No block matches. Try fewer words, or search by opcode.
Hidden / legacy blocks 118
These blocks are not shown in the palette any more, mostly because a newer block replaced them. They keep working in projects that already contain them. Listed as plain text.
disconnect from instance [URL]opcodebiDisconnectInstanceRedundant 1.8 connection or ID variant; original opcode retained as the primary block.connect to Ember server [URL]opcodebiConnectRedundant 1.8 connection or ID variant; original opcode retained as the primary block.voice channel info for [CHANNEL] on instance [URL] server ID [SERVER] as JSONopcodebiVoiceInfoIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.community details of instance [URL] server ID [SERVER] as JSONopcodebiCommunityIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.join the community on instance [URL] server ID [SERVER]opcodebiJoinIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.join request pending on instance [URL] server ID [SERVER]?opcodebiPendingIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.leave the community on instance [URL] server ID [SERVER]opcodebiLeaveIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.members of instance [URL] server ID [SERVER] as JSONopcodebiMembersIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.roles of instance [URL] server ID [SERVER] as JSONopcodebiRolesIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.my permission mask on instance [URL] server ID [SERVER]opcodebiPermissionsIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.I have permission [PERMISSION] in channel ID [CHANNEL] on instance [URL] server ID [SERVER]?opcodebiHasPermissionIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.[ACTION] role [ROLE] for member [USER] on instance [URL] server ID [SERVER]opcodebiSetRoleIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.kick member [USER] from instance [URL] server ID [SERVER]opcodebiKickIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.ban member [USER] from instance [URL] server ID [SERVER]opcodebiBanIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.unban [USER] on instance [URL] server ID [SERVER]opcodebiUnbanIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.pending join requests on instance [URL] server ID [SERVER] as JSONopcodebiJoinRequestsIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.accept join request from [USER] on instance [URL] server ID [SERVER]opcodebiAcceptRequestIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.deny join request from [USER] on instance [URL] server ID [SERVER]opcodebiDenyRequestIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.create invite on instance [URL] server ID [SERVER] expires in [SECONDS] seconds (0 = never) max uses [USES] (0 = unlimited)opcodebiCreateInviteIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.invites of instance [URL] server ID [SERVER] as JSONopcodebiInvitesIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.delete invite [CODE] on instance [URL] server ID [SERVER]opcodebiDeleteInviteIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.channels of instance [URL] server ID [SERVER] as JSONopcodebiChannelsIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.channel ID named [NAME] in server ID [SERVER] on instance [URL]opcodebiFindChannelIdRedundant 1.8 connection or ID variant; original opcode retained as the primary block.[PROP] of channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiChannelPropIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.create [TYPE] channel [NAME] on instance [URL] server ID [SERVER]opcodebiCreateChannelIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.rename channel ID [CHANNEL] to [NAME] on instance [URL] server ID [SERVER]opcodebiRenameChannelIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.delete channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiDeleteChannelIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.send [TEXT] to channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiSendIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.reply [TEXT] to message [ID] in channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiReplyIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.edit message [ID] to [TEXT] in channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiEditIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.send [TEXT] as bot [TOKEN] to channel id [CHANNEL] on instance [URL] server ID [SERVER] with alias [NAME] and avatar [AVATAR]opcodebiSendAliasIdsHidden from the palette. It still works in projects that already use it.set alias of message [ID] in channel id [CHANNEL] as bot [TOKEN] on instance [URL] server ID [SERVER] to [NAME] and avatar [AVATAR] (blank name clears it)opcodebiEditAliasIdsHidden from the palette. It still works in projects that already use it.delete message [ID] on instance [URL] server ID [SERVER] in channel ID [CHANNEL]opcodebiDeleteIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.react [EMOJI] to message [ID] on instance [URL] server ID [SERVER] in channel ID [CHANNEL]opcodebiReactIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.remove my reaction [EMOJI] from message [ID] on instance [URL] server ID [SERVER] in channel ID [CHANNEL]opcodebiUnreactIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.pin message [ID] on instance [URL] server ID [SERVER] in channel ID [CHANNEL]opcodebiPinIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.unpin message [ID] on instance [URL] server ID [SERVER] in channel ID [CHANNEL]opcodebiUnpinIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.pinned messages in channel ID [CHANNEL] on instance [URL] server ID [SERVER] as JSONopcodebiPinsIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.messages in channel ID [CHANNEL] on instance [URL] server ID [SERVER] as JSONopcodebiMessagesIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.messages in channel ID [CHANNEL] on instance [URL] server ID [SERVER] filters JSON [QUERY]opcodebiHistoryIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.message [ID] in channel ID [CHANNEL] on instance [URL] server ID [SERVER] as JSONopcodebiMessageIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.search [QUERY] in channel ID [CHANNEL] on instance [URL] server ID [SERVER] as JSONopcodebiSearchIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.search [QUERY] in the whole community on instance [URL] server ID [SERVER] as JSONopcodebiSearchAllIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.mark channel ID [CHANNEL] as read on instance [URL] server ID [SERVER] (up to message [ID], blank = latest)opcodebiMarkReadIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.show me typing in channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiTypingIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.who is typing in channel ID [CHANNEL] on instance [URL] server ID [SERVER] as JSONopcodebiTypingUsersIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.when a message is sent in [CHANNEL] on instance [URL] server ID [SERVER]opcodebiWhenMessageIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.alias name of last message on instance [URL] server ID [SERVER] (blank when none)opcodebiLastAliasIdsHidden from the palette. It still works in projects that already use it.upload file [FILE] named [FILENAME] for channel ID [CHANNEL] on instance [URL] server ID [SERVER] as attachment JSONopcodebiUploadIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.import media from [MEDIA_URL] for channel ID [CHANNEL] on instance [URL] server ID [SERVER] as attachment JSONopcodebiImportMediaIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.send [TEXT] with attachments JSON [ATTACHMENTS] to channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiSendAttachmentsIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.send [TEXT] with file [FILE] named [FILENAME] to channel ID [CHANNEL] on instance [URL] server ID [SERVER]opcodebiSendFileIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.bots on instance [URL] server ID [SERVER] as JSONopcodebiBotsIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.create bot [NAME] description [DESCRIPTION] on instance [URL] server ID [SERVER] (shows the token once) as JSONopcodebiCreateBotIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.remove bot [BOT] from instance [URL] server ID [SERVER]opcodebiRemoveBotIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.add gallery bot [BOT] to the community on instance [URL] server ID [SERVER]opcodebiAddGalleryBotIdsRedundant 1.8 connection or ID variant; original opcode retained as the primary block.set Ember servers server ID [SID] layout options JSON [OPTIONS]opcodebfPutChatServersSidLayoutEmber client UI / media picker / notification / staff / administration feature.notification preferences dataopcodebfGetChatNotifyEmber client UI / media picker / notification / staff / administration feature.set Ember notify [TARGET] options JSON [OPTIONS]opcodebfPutChatNotifyTargetEmber client UI / media picker / notification / staff / administration feature.chat preference dataopcodebfGetChatSettingsEmber client UI / media picker / notification / staff / administration feature.update Ember settings options JSON [OPTIONS]opcodebfPatchChatSettingsEmber client UI / media picker / notification / staff / administration feature.open chat destination dataopcodebfGetChatOpenEmber client UI / media picker / notification / staff / administration feature.GIF search results with filters [QUERY]opcodebfGetChatGifsEmber client UI / media picker / notification / staff / administration feature.media catalogue dataopcodebfGetChatMediaEmber client UI / media picker / notification / staff / administration feature.create / send Ember media save options JSON [OPTIONS]opcodebfPostChatMediaSaveEmber client UI / media picker / notification / staff / administration feature.Klipy media details for [KIND] item [SLUG]opcodebfGetChatKlipyKindSlugEmber client UI / media picker / notification / staff / administration feature.create / send Ember media gif options JSON [OPTIONS]opcodebfPostChatMediaGifEmber client UI / media picker / notification / staff / administration feature.remove Ember media [ID]opcodebfDeleteChatMediaIdEmber client UI / media picker / notification / staff / administration feature.remove Ember media query JSON [QUERY]opcodebfDeleteChatMediaEmber client UI / media picker / notification / staff / administration feature.emoji catalogue dataopcodebfGetChatEmojisEmber client UI / media picker / notification / staff / administration feature.emoji details for [EID]opcodebfGetChatEmojisEidInfoEmber client UI / media picker / notification / staff / administration feature.emoji catalogue for community server ID [SID]opcodebfGetChatServersSidEmojisEmber client UI / media picker / notification / staff / administration feature.create / send Ember servers server ID [SID] emojis options JSON [OPTIONS] file data URI [FILE] filename [FILENAME]opcodebfPostChatServersSidEmojisEmber client UI / media picker / notification / staff / administration feature.update Ember servers server ID [SID] emojis [EID] options JSON [OPTIONS]opcodebfPatchChatServersSidEmojisEidEmber client UI / media picker / notification / staff / administration feature.remove Ember servers server ID [SID] emojis [EID]opcodebfDeleteChatServersSidEmojisEidEmber client UI / media picker / notification / staff / administration feature.supported bridge servicesopcodebfGetChatBridgePlatformsEmber client UI / media picker / notification / staff / administration feature.linked communities on [PLATFORM]opcodebfGetChatBridgePlatformGuildsEmber client UI / media picker / notification / staff / administration feature.linked community [GID] on [PLATFORM]opcodebfGetChatBridgePlatformGuildsGidEmber client UI / media picker / notification / staff / administration feature.create / send Ember bridge [PLATFORM] guilds [GID] import options JSON [OPTIONS]opcodebfPostChatBridgePlatformGuildsGidImportEmber client UI / media picker / notification / staff / administration feature.bridge configuration for community server ID [SID]opcodebfGetChatBridgeServersSidEmber client UI / media picker / notification / staff / administration feature.set Ember bridge servers server ID [SID] options JSON [OPTIONS]opcodebfPutChatBridgeServersSidEmber client UI / media picker / notification / staff / administration feature.update Ember bridge servers server ID [SID] options JSON [OPTIONS]opcodebfPatchChatBridgeServersSidEmber client UI / media picker / notification / staff / administration feature.remove Ember bridge servers server ID [SID]opcodebfDeleteChatBridgeServersSidEmber client UI / media picker / notification / staff / administration feature.set Ember bridge servers server ID [SID] channels channel ID [CID] options JSON [OPTIONS]opcodebfPutChatBridgeServersSidChannelsCidEmber client UI / media picker / notification / staff / administration feature.CloudLink configuration for channel channel ID [CID]opcodebfGetChatChannelsCidCloudlinkEmber client UI / media picker / notification / staff / administration feature.post Ember channels channel ID [CID] cloudlink reconnectopcodebfPostChatChannelsCidCloudlinkReconnectEmber client UI / media picker / notification / staff / administration feature.my moderation inbox dataopcodebfGetChatModmailEmber client UI / media picker / notification / staff / administration feature.create / send Ember modmail read options JSON [OPTIONS]opcodebfPostChatModmailReadEmber client UI / media picker / notification / staff / administration feature.staff moderation inbox dataopcodebfGetChatModmailStaffEmber client UI / media picker / notification / staff / administration feature.moderation conversation with [USERNAME]opcodebfGetChatModmailWithUsernameEmber client UI / media picker / notification / staff / administration feature.create / send Ember modmail with [USERNAME] options JSON [OPTIONS]opcodebfPostChatModmailWithUsernameEmber client UI / media picker / notification / staff / administration feature.sound catalogue dataopcodebfGetChatSoundsEmber client UI / media picker / notification / staff / administration feature.sound catalogue for community server ID [SID]opcodebfGetChatServersSidSoundsEmber client UI / media picker / notification / staff / administration feature.create / send Ember servers server ID [SID] sounds options JSON [OPTIONS] file data URI [FILE] filename [FILENAME]opcodebfPostChatServersSidSoundsEmber client UI / media picker / notification / staff / administration feature.update Ember servers server ID [SID] sounds [ID] options JSON [OPTIONS]opcodebfPatchChatServersSidSoundsIdEmber client UI / media picker / notification / staff / administration feature.remove Ember servers server ID [SID] sounds [ID]opcodebfDeleteChatServersSidSoundsIdEmber client UI / media picker / notification / staff / administration feature.link preview data with options [QUERY]opcodebfGetChatUnfurlEmber client UI / media picker / notification / staff / administration feature.webhook configuration for channel channel ID [CID]opcodebfGetChatChannelsCidWebhooksEmber client UI / media picker / notification / staff / administration feature.create / send Ember channels channel ID [CID] webhooks options JSON [OPTIONS]opcodebfPostChatChannelsCidWebhooksEmber client UI / media picker / notification / staff / administration feature.update Ember hooks [WID] options JSON [OPTIONS]opcodebfPatchChatHooksWidEmber client UI / media picker / notification / staff / administration feature.remove Ember hooks [WID]opcodebfDeleteChatHooksWidEmber client UI / media picker / notification / staff / administration feature.create / send Ember hooks [WID] avatar options JSON [OPTIONS] file data URI [FILE] filename [FILENAME]opcodebfPostChatHooksWidAvatarEmber client UI / media picker / notification / staff / administration feature.play Nookara sound [SOUND]opcodebfPlaySoundEmber client UI / media picker / notification / staff / administration feature.bridge detail [PROP] for channel ID [CHANNEL] in server ID [SERVER]opcodebfCloudlinkStatusEmber client UI / media picker / notification / staff / administration feature.bridge connection active in channel ID [CHANNEL] of server ID [SERVER]?opcodebfCloudlinkConnectedEmber client UI / media picker / notification / staff / administration feature.when vMail receivedopcodewhenMailReceivedPreviously hidden legacy feature; registration preserved.send vMail to [TO] subject [SUBJECT] message [MSG]opcodesendMailPreviously hidden legacy feature; registration preserved.legacy inbox entriesopcodegetMailListPreviously hidden legacy feature; registration preserved.legacy inbox entry [N] textopcodegetMailBodyPreviously hidden legacy feature; registration preserved.delete vMail at index [N]opcodedeleteMailPreviously hidden legacy feature; registration preserved.delete all vMailopcodedeleteAllMailPreviously hidden legacy feature; registration preserved.call user [USER]opcodecallUserPreviously hidden legacy feature; registration preserved.when call receivedopcodewhenCallReceivedPreviously hidden legacy feature; registration preserved.call invitation detailsopcodecallDataPreviously hidden legacy feature; registration preserved.accept callopcodeacceptCallPreviously hidden legacy feature; registration preserved.set mic to [STATE]opcodesetMicPreviously hidden legacy feature; registration preserved.stop callopcodestopCallPreviously hidden legacy feature; registration preserved.
Errors
When a block fails it reports a red error in the project. The messages you will meet:
| Error | Meaning |
|---|---|
Missing permission: this block needs the ... scope, but this project never asked for it. | The permission integer of your project lacks a scope (for example Chat Messaging). Generate a new integer at nookara.cc/permissions. |
Missing permission: this block needs the ... scope, which you chose not to allow when you logged in. | The project asked, but the player unticked it. Run the sign-in block again and keep it ticked; the project should explain why it needs it. |
... was disabled for your account by an administrator. | The permission is on the token but a Nookara administrator switched that service off for the account. Signing in again does not help. |
Not logged in | Sign in to Nookara first (the sign in to Nookara block, or login with token). |
Invalid Ember server URL. | The address is not a web address. |
Ember servers require HTTPS (HTTP is allowed only on localhost). | Use an https:// address, or no username and password inside it. |
Unsupported Ember server. | The address answered but is not an Ember server of this protocol version. |
This server needs a local username and password. | The server does not use Nookara login. Use the connect block with a username and password. |
Invalid instance token response. / Invalid instance session response. | The server or Nookara answered with something unexpected. Try again later. |
not connected to URL: use the connect block | Run the connect block for that URL first, and use the same address everywhere. Nothing connects by itself. |
server not connected or not found: use the connect block and the server ID / channel ID (or an instance-scoped block) | An older ID-based block could not find the server or channel among the servers you are connected to. Connect first, then take the IDs from the JSON reporters (<code>servers of instance [URL] as JSON</code>, <code>channels of [URL] as JSON</code>). |
Ambiguous server / channel ID / name / message ID: use the connect block and ... | More than one connected server matched. Use the real server ID or channel ID, or an instance-scoped block that takes the address. |
Ember server disconnected. | The session ended (a 401 from the server, a ban, or you disconnected). The extension does not reconnect for you: connect again. |
Community join request is pending approval. | The server needs moderators to accept new members. Channel and member blocks work after approval. |
This Ember server has no community yet. | The server has no community to read or post in. |
channel_not_found | No channel has that name or id. Use channel id named [NAME] or channels of [URL] to check. |
message_not_found | The message id does not exist in that channel (reply and edit look it up first). |
Invalid message id. | Message ids are numbers. |
Invalid Ember webhook URL. | A webhook link looks like https://host/api/v1/webhooks/ID/TOKEN. |
server_read_only | A Nookara-hosted server that is read-only now (plan ended or the old chat). Writes are refused. |
bad_signature | The server rejected the message signature; the block retries once with a fresh key before failing. |
other server errors | Any other error code the server sends is shown as it is. Rate limits, roles and bans are decided by each server. |
Migrating old projects
Extension 1.9 runs everything on Ember servers, so projects made with 1.8 or with the older Nookara chat blocks keep working with a few differences to know about.
- Old opcodes still work. Existing blocks in a saved project (including the older Nookara-native chat blocks such as
send [MSG] in channel ID [CHANNEL] of server ID [SERVER],join community on server ID [SERVER] (URL or invite link)andwhen message received in channel ID [CHANNEL] of server ID [SERVER]) keep their internal names and load unchanged. They now run on the decentralized Ember system instead of Nookara-hosted chat. - Names and IDs. Those blocks now take a server ID and a channel ID. Unique legacy names and invite links are still accepted where they match exactly one connected server or channel, but an ambiguous name stops with an error: prefer IDs. Get them from
servers of instance [URL] as JSON,channels of [URL] as JSONorchannel id named [NAME] on [URL]. The classic global and room blocks (send global message [MSG],join channel ID [ROOM]) work on the channel you pick withjoin channel ID [ROOM], or on a channel named general. - Connect explicitly. The old behaviour of connecting on first use is gone. Add
connect to instance [URL]to your green flag script (after the sign-in finishes), once for every server the project uses. The older block textconnect to Ember server [URL]is hidden in 1.9 but a project that already contains it still works as an alias. - The project handles reconnects. The extension never retries a dropped connection or signs in on its own. Use
when instance [URL] becomes [STATE]to reconnect (for example when the state is disconnected or error). - Not in the palette any more. Pieces of the Ember app interface (GIFs, media pickers, emoji and sound catalogues, notification settings, moderation inbox, bridge setup, CloudLink status) are hidden and answer an empty result; use the Ember app for those. Variants with both an address and a server ID are hidden too: the address blocks cover them.
- Sessions, tokens and passwords are still never saved in the project file.
Signing
A signed message carries a proof that the Nookara account wrote it. When you ask for the Sign Messages scope (32768) in the permission integer and the player allows it (it starts unticked on the sign-in screen, so many players will not), messages sent with the blocks above are signed automatically on servers where you signed in with Nookara. The extension asks Nookara for the account signing key, keeps it only in memory, and signs the message text, channel, reply or edit link and attachments. Nothing changes for the project: the same blocks, no extra block. Without the scope, or with a local account, messages are sent unsigned: nothing fails and the server accepts them. Anyone can check a signature against Nookara's public keys; servers cannot require signatures.
Webhooks
A webhook is a link a server gives you for one channel. Anyone who has the link can post to that channel without signing in, which is exactly what you want for a game that posts scores. Create it in the channel settings of the server, copy the link, and paste it into the block send [TEXT] as webhook [WEBHOOK_URL]. Treat the link as a password: do not put one for an important channel in a project you share, because the project contains the link. The block sends only the text; the name and picture come from the webhook.
Three recipes
1. A chat box in a channel on chat.ikelene.net
Permission integer 2053 (Basic Profile + Project Auth + Chat Messaging). Scripts:
when green flag clicked
sign in to Nookara for [My chat box] with permissions [2053]
when authenticated
connect to instance [https://chat.ikelene.net]
set [history] to (messages in channel [general] on [https://chat.ikelene.net] as JSON)
when a message is sent in [general] on [https://chat.ikelene.net]
set [line] to (join (last message author on [https://chat.ikelene.net]) (join [: ] (last message text on [https://chat.ikelene.net])))
when [space] key pressed
ask [Say something] and wait
send (answer) to channel [general] on [https://chat.ikelene.net]The author reported is the account id. Use members of [URL] as JSON to map ids to display names, or look the user up with the lookup blocks.
2. A bot that answers !ping
Use a separate account for the bot so people can tell it apart. The simplest is a local account on a server that allows sign-ups, or the bot's own Nookara account.
when green flag clicked
connect to Ember server [https://example-bonfire.example.com] as [pingbot] password [your password]
when a message is sent in [general] on [https://example-bonfire.example.com]
if <(last message text on [URL]) = [!ping]> and <not <(last message author on [URL]) = (my id on [URL])>> then
reply [pong] to message (last message id on [URL]) in channel (last message channel on [URL]) on [URL]The check against my id on [URL] keeps the bot from answering its own messages. A bot that must run all the time belongs in the Python library (bot tokens), not in a project: blocks run only while the project is open.
3. Posting a game score through a webhook
when I receive [game over]
send (join [New score: ] (score)) as webhook [https://chat.ikelene.net/api/v1/webhooks/ID/TOKEN]Create the webhook in a channel made for scores, so the link cannot reach the rest of your server. The player does not need to sign in to Nookara for this block.
Permission errors in the other groups
The rest of the extension is a Nookara account toolkit. Everything below needs the project to be signed in, and most groups need a scope in the permission integer. Without it the block throws Missing permission: this block needs the (name) scope. If an administrator has turned a feature off for the account the block throws (name) was disabled for your account by an administrator. Not signed in gives Not logged in. Use administrator has paused [SERVICE]? to check ahead.
The groups starting with Nookara API and Ember JSON hold one block per route. Bot developers get gallery blocks there too (bot gallery list and details, my bot gallery status, save listing, submit to and withdraw from the gallery, add ticket); see the Bot gallery section of the API guide. They send the same requests as the Nookara API guide documents, and report the raw JSON. That guide also has the complete list of Ember server routes, bots, backups and hosting for use from Python.