Skip to content


A task is a construct which is comparable to a dialog. However, tasks are meant for non-interactive, non-interruptible computations, therefore, no statements are allowed that perform user-level side effects, like say, ask or show.

Typically, tasks are executed when an event comes in:

task event: "ping" do
  counter = counter + 1

The advantage of using tasks over dialogs here is that tasks execute outside of the current dialog context. Therefore, the current dialog continues undisturbed, and the dialog stack and history remain untouched. As a result, they execute without any other effects (like __returning__) and are also much more performant than dialogs.

Named tasks

Tasks can be given a name, just like dialogs:

task calculate do
  result = 12345

These can be then executed by calling perform from a dialog

dialog main do
  perform calculate
  say "The result is: " + result

Guard clauses

Just like guards in dialogs, tasks can have a guard clause which will decide whether the task will be executed or not.

task calculate when user.frontend == "slack" do
  revenue = revenue + 200

task calculate do
  revenue = revenue + 100

Task hooks

Tasks can be hooked into several places while the Bubblescript interpreter does its work.

The hook is attached by creating a task which has the before: keyword in its declaration. Tasks like these are executed before the event occurs.

All tasks with a before: hook are executed one after the other, not just the first one like with perform.

task before: dialog

Executed just before the dialog with the given name is executed.

dialog main do
  say welcome

task before: main do
  welcome = "Good afternoon"

task before: __user_message__

The before: __user_message__ hook gets executed any time a user's message enters into the system, regardless of it being caught by an ask or not. This hook can also be used to enrich the message variable with extra metadata.