2

我试图弄清楚如何通过 Botkit 的 startRTM 调用订阅 Slack 中的状态变化。目前我正在使用Botkit 的 starter slack bot,它有一个 rtm_manager 脚本来处理所有 rtm 的启动和关闭。

bot.startRTM(function(err, bot) {
   ...do stuff
});

我研究了 Slack 订阅存在事件的新方法,并了解我需要发送一个存在_sub或batch_presence_aware 参数才能订阅存在_更改事件。

我还查看了用于处理状态更新的 node-slack-sdk rtm 客户端的文档,该客户端使用 rtm.start 本身

rtm.start({
   batch_presence_aware: true
}); 

由于我使用的是使用 startRTM 方法的 botkit,因此我很难理解如何组合所有这些信息。在使用 botkit 的 startRTM 方法时,是否有任何文档或示例用于订阅状态更新?

4

1 回答 1

0

我认为首先我们应该将这两个概念分开:presence_subbatch_presence_aware

  1. presence_sub是一种 RTM 消息类型,您的应用可以将其发送到 Slack,以指示您的客户希望针对哪些用户进行状态更新。

  2. batch_presence_awarertm.start是一个参数,如果您希望将有关不同用户的状态更新分组到一条消息中,您的应用可以在调用时设置该参数。presence_change每个更新都作为一个事件到达。权衡是您的应用程序可能不会尽快获得presence_change,但它会处理更少的消息,这可以提高性能。这是可选的,但建议使用。

您所指的“新方式”是自 2018 年 1 月以来的行为变化。在更改之前,您的应用程序可能已经提供了一个presence_sub参数rtm.start,这将选择您的连接presence_change仅接收最后指示的用户的事件presence_sub信息; 否则,您的应用将为工作区中的每个用户接收这些更新。自更改以来,presence_sub=true对于所有连接,这实际上意味着您的应用必须发送presence_sub消息以获取任何presence_change事件。


现在让我们来看看如何在 Botkit 中使用这些信息。

  1. 设置您的控制器以通过 RTM 发送消息。

    var controller = Botkit.slackbot({
      // ...
      send_via_rtm: true,
    });
    

    在 starter repo 中,控制器是bot.jsbot_options. 您需要添加send_via_rtm选项以允许您发送的消息通过 RTM。batch_presence_aware不幸的是,我知道,Botkit 没有允许您使用的 API 。如果这是您想要的,我建议您在项目上打开一个问题。

  2. 为您想要更新的用户设置在线状态订阅。

    controller.say({
      type: "presence_sub",
      ids: [
        "U061F7AUR",
        "W123456"
      ]
    });
    

    您会希望在您的程序中尽早执行此操作。在初始存储库中,您可能希望将此和下一步组合为“技能”,因此将其放置在该目录中的新文件中,在导出的函数内将是一个不错的选择。请注意,您需要一份您希望为其订阅的用户 ID 的列表。由您决定如何获取该列表。每次您想要添加或删除订阅时,您还希望使用完整的用户列表执行相同的操作。

  3. 监听状态变化事件

    controller.on('presence_change', (bot, event) => {
      // `event` contains presence information
      console.log(event);
    });
    

    一旦您为其设置了在线订阅的用户更改在线状态,您将在此回调中收到一个事件。此处描述了确切的结构:https ://api.slack.com/events/presence_change 。

于 2018-06-07T03:10:03.993 回答