MS команды bot JS - создать разговор - PullRequest
0 голосов
/ 06 февраля 2020

Мне нужно активно создавать беседу на канале в msteams. Поэтому я искал примеры, но не нашел никаких примеров по-настоящему упреждающего создания беседы. Все примеры включают в себя, прежде всего, обработку сообщения и создание диалога с использованием контекста. Чтобы быть более точным, у меня есть Facebook, WhatsApp и веб-виджет. Пользователи пишут, например, из Facebook, я получаю сообщение через fb webhook, и мне нужно создать новую ветку (блок с ответами внутри канала), и только после этого, кто-то, кто ответит на канале, используя блок темы, и я получу сообщение. Как я понял, мне нужно bootstrap объект разговора и использовать adapter.createConversation ({... convFields}), но, например, у меня нет serviceUrl.

// i am using adapter from examples
new BotFrameworkAdapter({
      appId: id,
      appPassword: password
});

// then i have something like that in examples

    const conversationParameters = {
      isGroup: true,
      channelData: {
        channel: {
          id: 'msteams'
        }
      },

      activity: 'dsada'
    };


    const connectorClient = this.adapter.createConnectorClient(
      context.activity.serviceUrl // i don't have context to get that serviceUrl, because i must do it first, not handle message and create thread after that.
    );
    const conversationResourceResponse = await connectorClient.conversations.createConversation(
      conversationParameters as any
    );
    const conversationReference = TurnContext.getConversationReference(
      context.activity // same here, i don't have context
    );
    conversationReference.conversation.id = conversationResourceResponse.id;
    return [conversationReference, conversationResourceResponse.activityId];

1 Ответ

0 голосов
/ 14 февраля 2020

Чтобы предотвратить (или, по крайней мере, предотвратить) спам, ваш бот может отправлять проактивные сообщения только на каналы или групповые чаты, где он уже установлен. В этом случае вам нужно будет сохранить необходимую информацию из полученного вами события dialogUpdate membersAdded.

Для чатов 1: 1 можно создать новый разговор с пользователем, однако ваш бот нуждается в этом. знать идентификатор пользователя, чтобы сделать это. Обычно это достигается путем получения списка группового чата или команды, в которой установлен ваш бот.

По существу, невозможно отправить полностью проактивное сообщение - бот должен быть установлен и / или иметь некоторое количество информации о том, куда оно отправляло сообщение ранее.

Если вы можете получить правильные разрешения, можно предварительно установить вашего бота. См. Эту статью для получения более подробной информации об этом подходе: https://docs.microsoft.com/en-us/graph/teams-proactive-messaging

Несмотря на то, что он находится в C#, этот образец может оказаться полезным, поскольку он демонстрирует минимальный объем информации, требуемый для порядок отправки проактивных сообщений каждому типу назначения (который одинаков для разных языков): https://github.com/clearab/teamsProactiveMessaging.

Соответствующий файл находится ниже:

public class MessageSender : IMessageSender
{
    private ConnectorClient conClient;
    private string serviceUrl;

    public MessageSender(string serviceUrl, string id, string password)
    {
        MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);
        conClient = new ConnectorClient(new Uri(serviceUrl), id, password);
    }

    public async Task<ResourceResponse> SendOneToOneMessage(string conversationId, Activity activity)
    {
        return await conClient.Conversations.SendToConversationAsync(conversationId, activity);

    }

    public async Task<ConversationResourceResponse> CreateOneToOneConversation(string userId, string tenantId)
    {
        var members = new List<ChannelAccount>()
        {
            new ChannelAccount
            {
                Id = userId
            }
        };

        ConversationParameters conParams = new ConversationParameters
        {
            Members = members,
            TenantId = tenantId
        };

        return await this.conClient.Conversations.CreateConversationAsync(conParams);

    }

    public async Task<ConversationResourceResponse> CreateAndSendChannelMessage(string channelId, Activity activity)
    {
        ConversationParameters conParams = new ConversationParameters
        {
            ChannelData = new TeamsChannelData
            {
                Channel = new ChannelInfo(channelId)
            },
            Activity = activity
        };

        ConversationResourceResponse response = await this.conClient.Conversations.CreateConversationAsync(conParams);

        return response;
    }

    public async Task<ResourceResponse> SendReplyToConversationThread(string threadId, Activity activity)
    {
        return await this.conClient.Conversations.SendToConversationAsync(threadId, activity);
    }
}
...