botpress--botpress
254 行
8.6 KiB
TypeScript
254 行
8.6 KiB
TypeScript
import { posthogHelper } from '@botpress/common'
|
|
import { z, IntegrationDefinition } from '@botpress/sdk'
|
|
import * as sdk from '@botpress/sdk'
|
|
import proactiveConversation from 'bp_modules/proactive-conversation'
|
|
import proactiveUser from 'bp_modules/proactive-user'
|
|
import typingIndicator from 'bp_modules/typing-indicator'
|
|
import { actions } from './definitions/actions'
|
|
import { messages } from './definitions/channels/channel/messages'
|
|
|
|
export const INTEGRATION_NAME = 'messenger'
|
|
export const INTEGRATION_VERSION = '5.1.12'
|
|
|
|
const commonConfigSchema = z.object({
|
|
downloadMedia: z
|
|
.boolean()
|
|
.default(false)
|
|
.title('Download Media')
|
|
.describe(
|
|
'Automatically download media files using the Files API for content access. If disabled, Messenger media URLs will be used.'
|
|
),
|
|
downloadedMediaExpiry: z
|
|
.number()
|
|
.default(24)
|
|
.optional()
|
|
.title('Downloaded Media Expiry')
|
|
.describe(
|
|
'Expiry time in hours for downloaded media files. An expiry time of 0 means the files will never expire.'
|
|
),
|
|
})
|
|
|
|
const replyToCommentsSchema = z.object({
|
|
replyToComments: z
|
|
.boolean()
|
|
.default(false)
|
|
.title('Reply to Comments')
|
|
.describe('Whether to reply to comments on Facebook posts (limited to 1 reply per top-level comment)'),
|
|
})
|
|
|
|
export default new IntegrationDefinition({
|
|
name: INTEGRATION_NAME,
|
|
version: INTEGRATION_VERSION,
|
|
title: 'Messenger and Facebook',
|
|
description:
|
|
'Give your bot access to one of the world’s largest messaging platforms and manage your Facebook page content in one place.',
|
|
icon: 'icon.svg',
|
|
readme: 'hub.md',
|
|
configuration: {
|
|
identifier: {
|
|
linkTemplateScript: 'linkTemplate.vrl',
|
|
required: true,
|
|
},
|
|
schema: commonConfigSchema.merge(replyToCommentsSchema),
|
|
},
|
|
configurations: {
|
|
manual: {
|
|
title: 'Manual Configuration',
|
|
description: 'Configure by manually supplying the Meta app details',
|
|
schema: z
|
|
.object({
|
|
clientId: z.string().title('Client ID').min(1).describe('Meta app client id'),
|
|
clientSecret: z
|
|
.string()
|
|
.title('Client Secret')
|
|
.optional()
|
|
.describe('Meta App secret used for webhook signature check. Leave empty to disable signature check.'),
|
|
verifyToken: z
|
|
.string()
|
|
.title('Verify Token')
|
|
.min(1)
|
|
.describe(
|
|
'Token used for verification when subscribing to webhooks on the Meta app (enter a random string of your choice)'
|
|
),
|
|
accessToken: z
|
|
.string()
|
|
.title('Access Token')
|
|
.min(1)
|
|
.describe('Page access token that with permissions to access the Facebook page'),
|
|
pageId: z.string().min(1).describe('Id from the Facebook page').title('Page ID'),
|
|
shouldGetUserProfile: z
|
|
.boolean()
|
|
.default(true)
|
|
.optional()
|
|
.describe('Whether to get the user profile infos from Messenger when creating a new user')
|
|
.title('Get User Profile'),
|
|
})
|
|
.merge(commonConfigSchema)
|
|
.merge(replyToCommentsSchema),
|
|
},
|
|
sandbox: {
|
|
title: 'Sandbox Configuration',
|
|
description: 'Sandbox configuration, for testing purposes only',
|
|
schema: commonConfigSchema,
|
|
identifier: {
|
|
linkTemplateScript: 'sandboxLinkTemplate.vrl',
|
|
},
|
|
},
|
|
},
|
|
identifier: {
|
|
extractScript: 'extract.vrl',
|
|
fallbackHandlerScript: 'fallbackHandler.vrl',
|
|
},
|
|
channels: {
|
|
channel: {
|
|
title: 'Messenger conversation',
|
|
description: 'Channel for a Messenger conversation',
|
|
messages,
|
|
message: {
|
|
tags: {
|
|
id: { title: 'Message ID', description: 'The Messenger ID of the message' },
|
|
commentId: {
|
|
title: 'Comment ID',
|
|
description: 'The Messenger ID of the comment for which the message is a private-reply to',
|
|
},
|
|
recipientId: { title: 'Recipient ID', description: 'The Messenger ID of the recipient' },
|
|
senderId: { title: 'Sender ID', description: 'The Messenger ID of the sender' },
|
|
},
|
|
},
|
|
conversation: {
|
|
tags: {
|
|
id: { title: 'Conversation ID', description: 'The Messenger user ID of the user in the conversation' },
|
|
commentId: {
|
|
title: 'Comment ID',
|
|
description: 'The Messenger ID of the comment from which the private-reply conversation was created',
|
|
},
|
|
lastCommentId: {
|
|
title: 'Last Comment ID',
|
|
description: 'The Messenger ID of the comment from which a private-reply message was last sent',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
commentReplies: {
|
|
title: 'Comment Replies',
|
|
description: 'Channel for replies to comments on Facebook posts',
|
|
messages: { text: sdk.messages.defaults.text },
|
|
message: {
|
|
tags: {
|
|
id: { title: 'Comment ID', description: 'The unique ID of the comment' },
|
|
postId: { title: 'Post ID', description: 'The Facebook post ID where the comment was posted' },
|
|
},
|
|
},
|
|
conversation: {
|
|
tags: {
|
|
id: { title: 'Comment ID', description: 'The Facebook comment ID under which the reply was posted' },
|
|
postId: { title: 'Post ID', description: 'The Facebook post ID where the comment was posted' },
|
|
userId: { title: 'User ID', description: 'The Facebook user ID of the user who posted the comment' },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
actions,
|
|
events: {},
|
|
states: {
|
|
oauth: {
|
|
type: 'integration',
|
|
schema: z.object({
|
|
// TODO: Rename to 'userToken' if we bump a major
|
|
accessToken: z.string().optional().title('Access token').describe('The access token obtained by OAuth'),
|
|
pageToken: z
|
|
.string()
|
|
.optional()
|
|
.title('Page token')
|
|
.describe('The token used to authenticate API calls related to the page'),
|
|
pageId: z.string().optional().title('Page ID').describe('The page ID'),
|
|
}),
|
|
},
|
|
},
|
|
secrets: {
|
|
...posthogHelper.COMMON_SECRET_NAMES,
|
|
CLIENT_ID: {
|
|
description: 'The client ID of your Meta app',
|
|
},
|
|
CLIENT_SECRET: {
|
|
description: 'The client secret of your Meta app',
|
|
},
|
|
OAUTH_CONFIG_ID: {
|
|
description: 'The OAuth configuration ID for the OAuth Meta app',
|
|
},
|
|
VERIFY_TOKEN: {
|
|
description: 'The verify token for the Meta Webhooks subscription',
|
|
},
|
|
ACCESS_TOKEN: {
|
|
description: 'Access token for internal Meta App',
|
|
},
|
|
SHOULD_GET_USER_PROFILE: {
|
|
description: "Whether to get the user profile infos from Messenger when creating a new user ('true' or 'false')",
|
|
},
|
|
SANDBOX_CLIENT_ID: {
|
|
description: 'The client ID of the Sandbox Meta app',
|
|
},
|
|
SANDBOX_CLIENT_SECRET: {
|
|
description: 'The client secret of the Sandbox Meta app',
|
|
},
|
|
SANDBOX_VERIFY_TOKEN: {
|
|
description: 'The verify token for the Sandbox Meta App Webhooks subscription',
|
|
},
|
|
SANDBOX_ACCESS_TOKEN: {
|
|
description: 'Access token for the Sandbox Meta App',
|
|
},
|
|
SANDBOX_PAGE_ID: {
|
|
description: 'Page ID for the Sandbox Facebook page',
|
|
},
|
|
SANDBOX_SHOULD_GET_USER_PROFILE: {
|
|
description: "Whether to get the user profile infos from Messenger when creating a new user ('true' or 'false')",
|
|
},
|
|
},
|
|
user: {
|
|
tags: { id: { title: 'User ID', description: 'The Messenger ID of the user' } },
|
|
},
|
|
entities: {
|
|
user: {
|
|
schema: z
|
|
.object({
|
|
id: z.string().title('User ID').describe('The Messenger ID of the user'),
|
|
})
|
|
.title('User')
|
|
.describe('The user object fields'),
|
|
title: 'User',
|
|
description: 'A Messenger user',
|
|
},
|
|
conversation: {
|
|
schema: z
|
|
.object({
|
|
userId: z.string().title('User ID').describe('The Messenger user ID of the user in the conversation'),
|
|
commentId: z
|
|
.string()
|
|
.optional()
|
|
.title('Comment ID')
|
|
.describe('The Messenger ID of the comment for which the private-reply conversation should be created'),
|
|
})
|
|
.title('Conversation')
|
|
.describe('The conversation object fields'),
|
|
title: 'Conversation',
|
|
description: 'A conversation with a Messenger user',
|
|
},
|
|
},
|
|
attributes: {
|
|
category: 'Communication & Channels',
|
|
guideSlug: 'messenger',
|
|
repo: 'botpress',
|
|
},
|
|
})
|
|
.extend(typingIndicator, () => ({ entities: {} }))
|
|
.extend(proactiveUser, ({ entities }) => ({
|
|
entities: {
|
|
user: entities.user,
|
|
},
|
|
}))
|
|
.extend(proactiveConversation, ({ entities }) => ({
|
|
entities: {
|
|
conversation: entities.conversation,
|
|
},
|
|
}))
|