Как отличить сообщения «бот» от пользователя и «бот» от пользователя, используя промежуточное ПО в конструкторе ботов SDK v4? - PullRequest
0 голосов
/ 17 января 2019

Я внедрил промежуточное программное обеспечение в sdk V4 Bot, чтобы перехватывать каждое сообщение между ботом и пользователем и регистрировать этот монго Db. Я пытаюсь реализовать аналогичную концепцию для бота, построенного с использованием SDK v4. Похоже, я могу использовать следующий фрагмент кода для добавления промежуточного программного обеспечения, но не знаю, как различить сообщение между ботом и пользователем и ботом.

код бота V3

bot.use({
    botbuilder: function (session, next) {
        logUserConversation(session)
        next()
    },
    send: function (event, next) {
        logBotsConversation(event)
        next()
    }
})

V4 код бота для Middleware

botAdapter.use(async (turnContext, next) => {
    // How to find which messages/activity object is from user to bot

    await next();
    // How to find which messages/activity object is from bot to user.
});

1 Ответ

0 голосов
/ 17 января 2019

Таким образом, функция, которую вы передаете .use, представляет собой часть промежуточного программного обеспечения, которое может выполнять до и после обработки входящего действия. Вы получаете доступ к "текущему" действию из контекста поворота через свойство turnContext.Activity. Эти действия могут быть отправлены пользователем или какой-либо другой системой, которая отправляет их через API DirectLine боту (при условии, что вы используете Bot Framework Service).

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

Все это выглядит примерно так:

botAdapter.use(async (turnContext, next) => {
    // pre-processing of the current incoming activity
    console.log(`Processing activity ${turnContext.activity.id} starting... `);

    // hook up a handler to process any outgoing activities sent during this turn
    turnContext.onSendActivities(async (sendContext, activities, nextSend) => {
       // pre-processing of outgoing activities

       await nextSend();       

       // post-processing outgoing activities
    });

    await next();

    // post-processing of the current incoming activity 
    console.log(`Processing activity ${turnContext.activity.id} finishing. `);    

});

Следует отметить, что обработчики исходящих действий могут вызываться 0..* раз, так как они в основном инициируются нисходящей логикой, вызывающей turnContext.sendActivit[y|ies]. Поэтому, если во время хода отправлено несколько действий, ваш обработчик будет вызываться для каждого пакета.

...