Skip to content

Commit 1f12f10

Browse files
feat(sdk): new typing indicator interface (botpress#13254)
1 parent e847887 commit 1f12f10

File tree

13 files changed

+106
-28
lines changed

13 files changed

+106
-28
lines changed

Diff for: integrations/telegram/integration.definition.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { z, IntegrationDefinition, messages } from '@botpress/sdk'
1+
import { z, IntegrationDefinition, messages, interfaces } from '@botpress/sdk'
22
import { sentry as sentryHelpers } from '@botpress/sdk-addons'
33

44
export default new IntegrationDefinition({
55
name: 'telegram',
6-
version: '0.4.5',
6+
version: '0.5.0',
77
title: 'Telegram',
88
description: 'This integration allows your bot to interact with Telegram.',
99
icon: 'icon.svg',
@@ -32,4 +32,4 @@ export default new IntegrationDefinition({
3232
},
3333
creation: { enabled: true, requiredTags: ['id'] },
3434
},
35-
})
35+
}).extend(interfaces.typingIndicator, () => ({}))

Diff for: integrations/telegram/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"@botpress/sdk-addons": "workspace:*",
1919
"@sentry/node": "7.53.1",
2020
"lodash": "^4.17.21",
21-
"telegraf": "^4.11.2",
21+
"telegraf": "^4.16.3",
2222
"zod": "^3.20.6"
2323
},
2424
"devDependencies": {

Diff for: integrations/telegram/src/index.ts

+28-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
ackMessage,
1515
convertTelegramMessageToBotpressMessage,
1616
wrapHandler,
17+
getMessageId,
1718
} from './misc/utils'
1819
import * as bp from '.botpress'
1920

@@ -26,7 +27,33 @@ const integration = new bp.Integration({
2627
const telegraf = new Telegraf(ctx.configuration.botToken)
2728
await telegraf.telegram.deleteWebhook({ drop_pending_updates: true })
2829
},
29-
actions: {},
30+
actions: {
31+
startTypingIndicator: async ({ input, ctx, client }) => {
32+
const telegraf = new Telegraf(ctx.configuration.botToken)
33+
const { conversation } = await client.getConversation({ id: input.conversationId })
34+
const { message } = await client.getMessage({ id: input.messageId })
35+
36+
const chat = getChat(conversation)
37+
const messageId = getMessageId(message)
38+
39+
await telegraf.telegram.sendChatAction(chat, 'typing')
40+
await telegraf.telegram.setMessageReaction(chat, messageId, [{ type: 'emoji', emoji: '👀' }])
41+
42+
return {}
43+
},
44+
stopTypingIndicator: async ({ input, ctx, client }) => {
45+
const telegraf = new Telegraf(ctx.configuration.botToken)
46+
const { conversation } = await client.getConversation({ id: input.conversationId })
47+
const { message } = await client.getMessage({ id: input.messageId })
48+
49+
const chat = getChat(conversation)
50+
const messageId = getMessageId(message)
51+
52+
await telegraf.telegram.setMessageReaction(chat, messageId, [])
53+
54+
return {}
55+
},
56+
},
3057
channels: {
3158
channel: {
3259
messages: {

Diff for: integrations/telegram/src/misc/utils.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { axios } from '@botpress/client'
2+
import { RuntimeError } from '@botpress/sdk'
23
import { AssertionError, ok } from 'assert'
34
import _ from 'lodash'
45
import { Context, Markup, Telegraf, Telegram } from 'telegraf'
@@ -48,12 +49,22 @@ export function getChat(conversation: MessageHandlerProps['conversation']): stri
4849
const chat = conversation.tags.chatId
4950

5051
if (!chat) {
51-
throw Error(`No chat found for conversation ${conversation.id}`)
52+
throw new RuntimeError(`No chat found for conversation ${conversation.id}`)
5253
}
5354

5455
return chat
5556
}
5657

58+
export function getMessageId(message: MessageHandlerProps['message']): number {
59+
const messageId = message.tags.id
60+
61+
if (!messageId) {
62+
throw new RuntimeError(`No message ID found for message ${message.id}`)
63+
}
64+
65+
return Number(messageId)
66+
}
67+
5768
export const getUserNameFromTelegramUser = (telegramUser: User) => {
5869
if (telegramUser.first_name && telegramUser.last_name) {
5970
return `${telegramUser.first_name} ${telegramUser.last_name}`

Diff for: packages/cli/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@botpress/cli",
3-
"version": "0.8.60",
3+
"version": "0.8.61",
44
"description": "Botpress CLI",
55
"scripts": {
66
"build": "pnpm run bundle && pnpm run template:gen",
@@ -21,7 +21,7 @@
2121
"main": "dist/index.js",
2222
"dependencies": {
2323
"@botpress/client": "0.29.1",
24-
"@botpress/sdk": "0.10.11",
24+
"@botpress/sdk": "0.10.12",
2525
"@bpinternal/const": "^0.0.20",
2626
"@bpinternal/tunnel": "^0.1.1",
2727
"@bpinternal/yargs-extra": "^0.0.3",

Diff for: packages/cli/templates/echo-bot/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"private": true,
77
"dependencies": {
88
"@botpress/client": "0.29.1",
9-
"@botpress/sdk": "0.10.11"
9+
"@botpress/sdk": "0.10.12"
1010
},
1111
"devDependencies": {
1212
"@types/node": "^18.11.17",

Diff for: packages/cli/templates/empty-integration/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"private": true,
88
"dependencies": {
99
"@botpress/client": "0.29.1",
10-
"@botpress/sdk": "0.10.11"
10+
"@botpress/sdk": "0.10.12"
1111
},
1212
"devDependencies": {
1313
"@types/node": "^18.11.17",

Diff for: packages/cli/templates/hello-world/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"private": true,
88
"dependencies": {
99
"@botpress/client": "0.29.1",
10-
"@botpress/sdk": "0.10.11"
10+
"@botpress/sdk": "0.10.12"
1111
},
1212
"devDependencies": {
1313
"@types/node": "^18.11.17",

Diff for: packages/cli/templates/webhook-message/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"private": true,
88
"dependencies": {
99
"@botpress/client": "0.29.1",
10-
"@botpress/sdk": "0.10.11",
10+
"@botpress/sdk": "0.10.12",
1111
"axios": "^1.6.8"
1212
},
1313
"devDependencies": {

Diff for: packages/sdk/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@botpress/sdk",
3-
"version": "0.10.11",
3+
"version": "0.10.12",
44
"description": "Botpress SDK",
55
"main": "./dist/index.js",
66
"types": "./dist/index.d.ts",

Diff for: packages/sdk/src/interfaces/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ export * from './llm'
55
export * from './speech-to-text'
66
export * from './sync'
77
export * from './text-to-image'
8+
export * from './typing-indicator'

Diff for: packages/sdk/src/interfaces/typing-indicator.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { InterfaceDeclaration } from '../integration'
2+
import z from '../zui'
3+
4+
export const typingIndicator = new InterfaceDeclaration({
5+
name: 'typingIndicator',
6+
version: '0.0.1',
7+
entities: {},
8+
events: {},
9+
actions: {
10+
startTypingIndicator: {
11+
input: {
12+
schema: () =>
13+
z.object({
14+
conversationId: z.string(),
15+
messageId: z.string().describe('The message ID to which the typing indicator should be attached'),
16+
timeout: z
17+
.number()
18+
.optional()
19+
.describe('The timeout in milliseconds after which the typing indicator should stop'),
20+
}),
21+
},
22+
output: {
23+
schema: () => z.object({}),
24+
},
25+
},
26+
stopTypingIndicator: {
27+
input: {
28+
schema: () =>
29+
z.object({
30+
conversationId: z.string(),
31+
messageId: z.string().describe('The message ID from which the typing indicator should be removed'),
32+
}),
33+
},
34+
output: {
35+
schema: () => z.object({}),
36+
},
37+
},
38+
},
39+
})

Diff for: pnpm-lock.yaml

+15-15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)