Files
2026-07-13 13:34:48 +08:00

210 lines
7.3 KiB
TypeScript

import * as sdk from '@botpress/sdk'
type Channel = 'dm' | 'channel'
export type Target = {
displayName: string
tags: { [key: string]: string }
channel: Channel
}
export const actions = {
addReaction: {
title: 'Add Reaction',
description: 'Add a reaction to a message',
input: {
schema: sdk.z.object({
name: sdk.z
.string()
.title('Reaction name')
.describe('The name of the reaction to add, ex: thumbsup')
.placeholder('thumbsup'),
messageId: sdk.z.string().title('Message ID').describe('The ID of the message, ex: {{event.messageId}}'),
}),
},
output: {
schema: sdk.z.object({}),
},
},
findTarget: {
title: 'Find Target',
description: 'Find a target in Slack (ex: a channel, a user to send a dm, etc)',
input: {
schema: sdk.z.object({
query: sdk.z
.string()
.min(2)
.title('Search Query')
.describe('What to search for, ex name of a channel, a user, etc.'),
channel: sdk.z
.enum(['dm', 'channel'])
.title('Channel Name')
.describe('Which channel to look into, ex: dm, channel'),
}),
},
output: {
schema: sdk.z.object({
targets: sdk.z
.array(
sdk.z.object({
displayName: sdk.z.string().title('Display Name').describe('The display name of the target'),
tags: sdk.z.record(sdk.z.string()).title('Tags').describe('The tags of the target'),
channel: sdk.z
.enum(['dm', 'channel'])
.title('Channel type')
.describe('The type of channel of the target'),
})
)
.title('Targets')
.describe('The matching targets'),
}),
},
},
retrieveMessage: {
title: 'Retrieve Message',
description: 'Retrieve a message from Slack',
input: {
schema: sdk.z.object({
ts: sdk.z.string().title('Timestamp').describe('The timestamp of the message to retrieve'),
channel: sdk.z.string().title('Channel').describe('The channel of the message to retrieve'),
}),
},
output: {
schema: sdk.z.object({
type: sdk.z.string().title('Type').describe('The type of the message'),
user: sdk.z.string().title('User').describe('The user who sent the message'),
ts: sdk.z.string().title('Timestamp').describe('The timestamp of the message'),
text: sdk.z.string().title('Text').describe('The text of the message'),
}),
},
},
getOrCreateChannelConversation: {
title: 'Get or Create Channel Conversation',
description: 'Get or create a conversation in a channel',
input: {
schema: sdk.z.object({
conversation: sdk.z.object({
channelId: sdk.z
.string()
.optional()
.title('Channel ID')
.describe('The ID of the channel you want the conversation to be created at'),
}),
}),
},
output: {
schema: sdk.z.object({
conversationId: sdk.z.string().title('Conversation ID').describe('The ID of the new conversation'),
}),
},
},
syncMembers: {
title: 'Sync Members',
description:
'Sync Slack workspace members to Botpress users. This action keeps track of the last sync timestamp and will only sync updated members since the last sync.',
input: {
schema: sdk.z.object({}),
},
output: {
schema: sdk.z.object({
syncedCount: sdk.z.number().title('Synced Count').describe('The number of members synced'),
}),
},
},
updateChannelTopic: {
title: 'Update Channel Topic',
description: 'Update the topic of a channel',
input: {
schema: sdk.z.object({
topic: sdk.z.string().title('New Topic').describe('The new topic of the channel'),
channelId: sdk.z.string().title('Channel ID').describe('The channel id of the target channel'),
}),
},
output: {
schema: sdk.z.object({}),
},
},
getChannelsInfo: {
title: 'Get Channels Info',
description:
'Get information about Slack channels one page at a time. Returns channel details for the current page and a cursor for the next page.',
input: {
schema: sdk.z.object({
includeArchived: sdk.z
.boolean()
.optional()
.title('Include Archived')
.describe('Whether to include archived channels in the results'),
includePrivate: sdk.z
.boolean()
.optional()
.title('Include Private')
.describe('Whether to include private channels in the results'),
includeDm: sdk.z
.boolean()
.optional()
.title('Include Direct Messages')
.describe('Whether to include direct messages in the results'),
cursor: sdk.z
.string()
.optional()
.title('Cursor')
.describe('Pagination cursor for fetching the next page of channels. Omit for the first page.'),
}),
},
output: {
schema: sdk.z.object({
channels: sdk.z
.array(
sdk.z.object({
id: sdk.z.string().title('Channel ID').describe('The Slack ID of the channel'),
name: sdk.z.string().title('Name').describe('The name of the channel'),
topic: sdk.z.string().title('Topic').describe('The topic of the channel'),
purpose: sdk.z.string().title('Purpose').describe('The purpose of the channel'),
numMembers: sdk.z.number().title('Number of Members').describe('The number of members in the channel'),
isPrivate: sdk.z.boolean().title('Is Private').describe('Whether the channel is private'),
isArchived: sdk.z.boolean().title('Is Archived').describe('Whether the channel is archived'),
isDm: sdk.z.boolean().title('Is DM').describe('Whether this is a direct message conversation'),
userId: sdk.z
.string()
.title('User ID')
.describe('The Slack user ID of the other participant (for 1:1 DMs)'),
creator: sdk.z.string().title('Creator').describe('The Slack user ID of the channel creator'),
created: sdk.z.number().title('Created').describe('The Unix timestamp of when the channel was created'),
})
)
.title('Channels')
.describe('List of channels on this page'),
nextCursor: sdk.z
.string()
.title('Next Cursor')
.describe('Cursor for the next page. Empty string if no more pages.'),
}),
},
},
getUserProfile: {
title: 'Get User Profile',
description: 'Get information about a user',
input: {
schema: sdk.z.object({
userId: sdk.z.string().title('User ID').describe('The ID of the user to retrieve information about'),
}),
},
output: {
schema: sdk.z.object({
firstName: sdk.z.string().optional().title('Firstname').describe('The first name of the user'),
lastName: sdk.z.string().optional().title('Lastname').describe('The last name of the user'),
email: sdk.z.string().optional().title('Email').describe('The email of the user'),
displayName: sdk.z.string().optional().title('Display Name').describe('The display name of the user'),
}),
},
},
} as const satisfies sdk.IntegrationDefinitionProps['actions']