API-интерфейс чата Stream.io - в ответе queryChannels не указано состояние элемента - PullRequest
1 голос
/ 06 апреля 2020

Когда я делаю следующее:

      const queryChannelsResponse = await this.client.queryChannels(
        { id: channelId },
        { last_updated_at: -1 },
        { state: true },

Сюда не входят участники. Как я могу получить информацию об участнике?

Я пишу веб-крючок и хочу, чтобы он отправил уведомление pu sh (в настоящее время я сам отправляю их через выставку) всем автономным пользователям.

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

В полезной нагрузке webhook message.new в документации присутствуют участники, но они отсутствуют в теле запроса:

{
    "type": "message.new",
    "cid": "messaging:394f36fd-d512-4f2b-a785-ab8dfe82af49",
    "message": {
        "id": "f73ee1a8-f6fd-450b-bc64-0840b4df8fd9-2b4908ad-e267-4c48-8f41-8c26c8f769ce",
        "text": "Ffddf",
        "html": "<p>Ffddf</p>\n",
        "type": "regular",
        "user": {
            "id": "f73ee1a8-f6fd-450b-bc64-0840b4df8fd9",
            "role": "user",
            "created_at": "2020-04-06T14:06:37.979584Z",
            "updated_at": "2020-04-06T19:45:39.556842Z",
            "last_active": "2020-04-06T19:45:39.54939Z",
            "banned": false,
            "online": true,
            "name": "Mark Everett",
            "image": "https://8dc-user-files-dev.s3.eu-west-1.amazonaws.com/MEMBER_PROFILE_IMAGE-f73ee1a8-f6fd-450b-bc64-0840b4df8fd9.png?v=6"
        },
        "attachments": [],
        "latest_reactions": [],
        "own_reactions": [],
        "reaction_counts": null,
        "reaction_scores": {},
        "reply_count": 0,
        "created_at": "2020-04-06T19:51:14.114803Z",
        "updated_at": "2020-04-06T19:51:14.114803Z",
        "mentioned_users": []
    },
    "user": {
        "id": "f73ee1a8-f6fd-450b-bc64-0840b4df8fd9",
        "role": "user",
        "created_at": "2020-04-06T14:06:37.979584Z",
        "updated_at": "2020-04-06T19:45:39.556842Z",
        "last_active": "2020-04-06T19:45:39.54939Z",
        "banned": false,
        "online": true,
        "channel_unread_count": 0,
        "channel_last_read_at": "1970-01-01T00:00:00Z",
        "total_unread_count": 0,
        "unread_channels": 0,
        "unread_count": 0,
        "image": "https://8dc-user-files-dev.s3.eu-west-1.amazonaws.com/MEMBER_PROFILE_IMAGE-f73ee1a8-f6fd-450b-bc64-0840b4df8fd9.png?v=6",
        "name": "Mark Everett"
    },
    "watcher_count": 1,
    "created_at": "2020-04-06T19:51:14.121213459Z",
    "channel_type": "messaging",
    "channel_id": "394f36fd-d512-4f2b-a785-ab8dfe82af49"
}

Мой план это сделать что-то вроде этого:

  public async getOfflineUserIds(channelId: string): Promise<string[]> {
    try {
      // Get the channel
      const queryChannelsResponse = await this.client.queryChannels(
        { id: channelId },
        { last_updated_at: -1 },
        { message_limit: 0, limit: 1, state: true},
      )
      const channel = queryChannelsResponse[0]

      console.log('channel: ', channel)

      // Get the channels members
      const userIds: string[] = []
      // tslint:disable-next-line: forin
      for (const index in channel.state.members) {
        userIds.push(channel.state.members[index].user_id)
      }
      console.log('userIds:', userIds)

      const queryUsersResponse = await this.client.queryUsers(
        { id: { $in: userIds } },
        { last_active: -1 },
        {},
      )

      console.log('queryUsersResponse:', queryUsersResponse)

      // Work out who is offline/online
      const offlineUserIds = queryUsersResponse.users
        .filter(u => !u.online)
        .map(u => u.id)

      return offlineUserIds
    } catch (err) {
      throw new InternalServerErrorException(
        'Error getting offline users for channel.',
        err,
      )
    }
  }

1 Ответ

1 голос
/ 07 апреля 2020

Теперь это решено.

Я не добавил участников в канал с channel.addMembers. Я создаю и добавляю участников на сервер, так как это отлично подходит для моего варианта использования.

Если это кому-нибудь поможет, я в итоге получу следующие два метода:

  public async getChannelUserIds(channelId: string): Promise<string[]> {
    try {
      const queryChannelsResponse = await this.client.queryChannels(
        { id: channelId },
        { last_updated_at: -1 },
        { message_limit: 0, limit: 1, state: true },
      )
      const channel = queryChannelsResponse[0]

      const userIds = Object.keys(channel.state.members)
      console.log('userIds:', userIds)

      return userIds
    } catch (err) {
      throw new InternalServerErrorException(
        `Error getting user ids for channel ('${channelId}').`,
        err,
      )
    }
  }
  public async getOfflineUserIds(userIds: string[]): Promise<string[]> {
    try {
      const queryUsersResponse = await this.client.queryUsers(
        { id: { $in: userIds } },
        { last_active: -1 },
        {},
      )

      console.log('queryUsersResponse:', queryUsersResponse)

      const offlineUserIds = queryUsersResponse.users
        .filter(u => !u.online)
        .map(u => u.user_id)

      return offlineUserIds
    } catch (err) {
      throw new InternalServerErrorException(
        `Error getting offline user ids from ('${JSON.stringify(
          userIds,
          null,
          2,
        )}').`,
        err,
      )
    }
  }

И затем в мой webhook я:

@Post('stream/messages')
  public async onReceive(
    @Req() req: Request,
    @Headers('x-signature') signature: string,
    @Body() body: any,
  ) {
    try {
      console.debug('webhooks-stream.messages.onReceive')
      this.chatService.verifyWebhook((req as any).rawBody, signature)

      console.log('DEBUG WEBHOOK BODY', JSON.stringify(body, null, 2))

      switch (body.type) {
        case 'message.new': {
          const offlineMemberIds = await this.chatService.getOfflineUserIds(
            body.members.map(member => member.user_id),
          )

      ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...