Проблема со ссылкой на разговор бота

#botframework #microsoft-teams

#ботфреймворк #microsoft-команды

Вопрос:

У меня проблема с моим проактивным ботом.

Моя проблема в том, что когда я добавляю бота в команду в первый раз, он запускает и событие, которое создает команду и общий канал.

Моя проблема в том, что он не создает ссылку на чат для других существующих каналов до добавления бота. Если я добавляю новый канал в команду, он запускает событие channelCreated и создается новая ссылка на разговор. Я переопределил OnConversationUpdateActivityAsync, и, как уже упоминалось, он работает при первом добавлении бота, а затем при добавлении новых каналов.

Кто-нибудь знает, что лучше всего использовать при первом добавлении бота? Должен ли я просто создавать ссылки на беседы для всех существующих каналов при первом добавлении бота?

https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages?tabs=dotnet

https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/16.proactive-messages

Ответ №1:

Я предполагаю, что вы просто хотите иметь возможность отправлять сообщения бота по всем каналам. Если это не так, дайте мне знать, и я отредактирую ответ.

Я рекомендую взглянуть на Teams - Start New Thread in Channel образец.

В принципе, вам нужно, чтобы бот получил список каналов:

 public class MyBot : TeamsActivityHandler
{
    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        IEnumerable<ChannelInfo> channels = await TeamsInfo.GetTeamChannelsAsync(turnContext, turnContext.Activity.TeamsGetTeamInfo().Id, cancellationToken);

        await turnContext.SendActivityAsync($"The channel count is: {channels.Count()}");
    }
}
  

И затем вы можете отправить упреждающее сообщение каналу, создав диалог, а затем продолжив его:

 var conversationParameters = new ConversationParameters
{
    IsGroup = true,
    ChannelData = new { channel = new { id = teamsChannelId } },
    Activity = (Activity)message,
};

ConversationReference conversationReference = null;

await ((BotFrameworkAdapter)turnContext.Adapter).CreateConversationAsync(
    teamsChannelId,
    serviceUrl,
    credentials,
    conversationParameters,
    (t, ct) =>
    {
        conversationReference = t.Activity.GetConversationReference();
        return Task.CompletedTask;
    },
    cancellationToken);


await ((BotFrameworkAdapter)turnContext.Adapter).ContinueConversationAsync(
    _appId,
    conversationReference,
    async (t, ct) =>
    {
        await t.SendActivityAsync(MessageFactory.Text("This will be the first response to the new thread"), ct);
    },
    cancellationToken);
}
  

Комментарии:

1. Спасибо за ваш ответ. Проблема в том, что у меня есть бот и у меня есть приложение. При добавлении моего приложения в команду / канал бот получает событие и вызывает OnConversationUpdateActivityAsync, где я создаю ссылку на разговор. Если мое приложение добавляется к другому существующему каналу, событие не отправляется боту. Итак, я думаю, нужно ли мне самому создавать ссылку на беседу или мне чего-то не хватает.

2. Но, как вы упомянули в своем ответе, я мог бы просто получить все каналы в команде, когда приложение / бот добавляется в команду в первый раз, и создать ссылки на разговоры для каждого. Это для того, чтобы я мог позже отправлять упреждающие сообщения членам команды.

3. @OskarJenssonFjeld Это правильно. Вы получаете событие только один раз, потому что вы получаете его, когда добавляете бота в КОМАНДУ, а не в канал. Команда может состоять из множества каналов, поэтому, как только бот добавляется в команду, он получает доступ ко всем каналам этой команды, поэтому именно тогда вы хотите запросить все каналы.

4. @OskarJenssonFjeld Смогли ли вы заставить это работать с моим ответом? Если это так, пожалуйста, «примите» и проголосуйте за него, чтобы другие могли быстро найти ответ, и я могу очистить это из своего трекера поддержки. Если нет, дайте мне знать, как еще я могу помочь!