Microsoft Bot - Node SDK: как отправлять сообщения на канал publi c, не отвечая на пред. деятельность* - PullRequest
0 голосов
/ 29 мая 2020

Контекст и теория

Согласно примерам документов и , вы должны сохранить ссылку на беседу, чтобы восстановить ее по запросу (например, когда сервер получает HTTP-запрос) и отправляет реактивное сообщение на канал publi c.

Итак, я делаю:

  1. Любой пользователь упоминает бота на канале ( по адресу #CorpChannel например)
  2. Бот сохраняет (в частности, я использую Azure Cosmos db) ссылку на беседу (storage.write(storeItems))
  3. [позже] Бот получает HTTP-запрос, который означает: "отправить привет туда" на #CorpChannel "
  4. Бот восстанавливает ссылку на беседу и использует ее для создания TurnContext для вызова sendActivity()

Проблема

Действие 'привет, отвечает на исходное упоминание моего бота вместо того, чтобы начать новую беседу / беседу по этому каналу. Я хочу начать новую беседу fre sh на # CorpChannel

Визуально:

Jane Doe: --------------
| @MyBot        09:00AM |
------------------------

Jhon Doe: --------------
| what ever     10:00AM |
------------------------

HTTP-запрос: «отправить привет туда» #CorpChannel "

Jhon Doe: --------------
| whatever      10:00AM |
------------------------

Jane Doe: --------------
| @MyBot        09:00AM |
------------------------
   |> MyBot: -----------
   |  Hi there  11:00AM |
    --------------------

То, что я пробовал

Это код, в который я отправляю активность по запросу

server.post("/api/notify", async (req, res) => {
  const channel = req.body.channel;
  const message = req.body.message;
  const conversation = await bot.loadChannelConversation(channel);

  if (!conversation) { /* ... */ }

  await adapter.continueConversation(conversation, async (context) => {
      await context.sendActivity(message);
  });

  return res.send({ notified: { channel, message } });
});

это код, в котором я собираюсь перейти к db

// (storage) is in the scope
const loadChannelConversation = async (key) => {
  try {
    const storeItems = await storage.read(['channels']);
    const channels = storeItems['channels'] || {};
    return channels[key] || null;
  } catch (err) {
    console.error(err);
    return undefined;
  }
};

как я могу опубликовать новое сообщение вместо ответа на исходный поток?

==== EDIT ====

Я также пробовал использовать метод createConversation() из SDK, но, как сказано в документации:

Сервис Bot Connector поддерживает создание групповых разговоров; однако этот метод и большинство каналов поддерживают только начало разговора с использованием прямого сообщения (негруппового).

Он начинает новый разговор с исходным пользователем, который отправил первое сообщение конфиденциально

1 Ответ

1 голос
/ 29 мая 2020

Идентификатор разговора в потоке канала Teams выглядит следующим образом: 19:1234abcd@thread.tacv2;messageid=12345

Все, что вам нужно сделать, чтобы начать новый поток, - это отправить сообщение на этот идентификатор разговора с удаленной частью «messageid». .

Вы можете удалить часть messageid следующим образом:

function getRootConversationId(turnContext) {
    const threadId = turnContext.activity.conversation.id;
    const messageIdIndex = threadId.indexOf(";messageid=");
    return messageIdIndex > 0 ? threadId.slice(0, messageIdIndex) : threadId;
}

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

const conversationId = getRootConversationId(turnContext);

// Send through the turn context

const conversation = turnContext.activity.conversation;
const threadId = conversation.id;
conversation.id = conversationId;

await turnContext.sendActivity("New thread (through the turn context)");

conversation.id = threadId;  // restore conversation ID

Вы также можете отправить сообщение напрямую через клиент коннектора, если не хотите беспокоиться о контексте поворота.

const conversationId = getRootConversationId(turnContext);

// Send through a connector client

const client = turnContext.turnState.get(turnContext.adapter.ConnectorClientKey);

await client.conversations.sendToConversation(
    conversationId,
    MessageFactory.text("New thread (through a connector client)"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...