Event and Reply
Replying messages is the most basic function in chat. In this lesson, you will learn how to receive events and make the response.
Time to accomplish: 10 minutes
Reply Simple Message
Let's change the reply a little bit. Open file src/handlers/handleChat.tsx
and edit the handler function to this:
// ...
async (
ctx: ChatEventContext & { event: { category: 'message' | 'postback' } }
) => {
const { event, reply } = ctx;
return reply("Hello! I'm a Todo Bot 🤖");
}
// ...
Try interacting with the bot, and it should reply with the string in reply("...").

The context.reply function sends messages back to the chat. Replying with a string
is the simplest way to use it.
JSX Syntax
In this tutorial, we'll use a more powerful way to send messages. That's JSX.
Try editing the content of reply to this:
return reply(<p>Hello! I'm a <b>Todo Bot</b> 🤖</p>);
The html alike syntax is a JSX expression.
It represents a section of chat UI in a conversation.
For example, the <p>...</p> element displays a message bubble containing the inner text.
You'll learn more useful JSX features in the lessons.
info
To use the JSX syntax in typescript, the file extension has to be .tsx.
Also you need to import Sociably at the beginning of the file like:
import Sociably from '@sociably/core';
Formatting Text
info
Messenger and LINE don't support text format, it shows plain text on them.
In the code above, <b>...</b> element makes the inner text bold if the platform supports it.
There are more text formatting tags like i, s and code.
You can check the full list of them here.
For example, <p><b>Hello!</b> <s>I'm a</s> <i>Todo</i> <code>Bot 🤖</code></p> might look like this:
Listen to Event
Handle Text Message
Text messages are the most common message type you would receive.
Let's enable the bot to handle an "add todo <todo name>" command.
Edit the handleChat function like this:
// ...
async (
ctx: ChatEventContext & { event: { category: 'message' | 'postback' } }
) => {
const { event, reply } = ctx;
if (event.type === 'text') {
const matchingAddTodo = event.text.match(/add(\s+todo)?(.*)/i);
if (matchingAddTodo) {
const todoName = matchingAddTodo[2].trim();
return reply(<p>Todo "<b>{todoName}</b>" is added!</p>);
}
}
return reply(<p>Hello! I'm a <b>Todo Bot</b> 🤖</p>);
}
// ...
Now your bot can accept add todo <name> command like:

Event Object
When a user sends a message to your bot, handleChat handler receives an event context object.
We can get the event information at context.event.
Here's the common properties of an event:
{
platform: 'messenger', // chat platform
category: 'message', // event category
type: 'text', // event type
payload: {/*...*/}, // raw data from chat platform
user: {/*...*/}, // user object
channel: {/*...*/}, // chat object
}
We can use the platform, category and type to identify what's happening.
An event with 'text' type always implements the event.text interface.
So we can extract the todo name with a regular expression safely.
if (event.type === 'text') {
console.log(event.text); // must be string
}
Advanced JSX
Use Expression in JSX
The {todoName} syntax above can be used to put any expression in the JSX.
For example, change it to {todoName.toUpperCase()} and see what happens.
Grouped Messages
Let's add some details after adding a todo. Edit the result message like this:
// ...
if (matchingAddTodo) {
const todoName = matchingAddTodo[2].trim();
return reply(
<>
<p>Todo "<b>{todoName}</b>" is added!</p>
<p>You have <b>{3}</b> todos now.</p>
</>
);
}
// ...
The element <>...</> with empty tag is a Fragment. You can use it to group
several messages together and send them once. The result would look like:

Adding a Pause
When sending a series of messages, you might want to shortly break between them.
We can use the Sociably.Pause tag to do that.
// ...
<>
<p>Todo "<b>{todoName}</b>" is added!</p>
<Sociably.Pause time={1500} />
<p>You have <b>{3}</b> todos now.</p>
</>
// ...
The code above adds a 1.5 second pause between two messages.
Our bot can receive events in the chatroom and answer simple messages. Next, we'll learn how to interact with users using in-chat widgets.