SendBird: Поиск в личном чате вместе с групповым чатом

SendBird рассматривает каждый канал как свой GroupChannel. Чат 1:1 также технически является GroupChannel только с двумя пользователями (с isDistinct = true, чтобы он возвращал личный чат, когда вы пытаетесь создать его снова).

У меня вопрос: как мне искать GroupChannel по имени, включая группу И чат 1:1? Групповой чат будет иметь общее имя, которое будет отображаться для всех пользователей в группе. Но для чата 1:1 у GroupChannel не будет имени, а если оно есть, оно не будет показано пользователям, как и для чата 1:1, мы всегда показываем имя другого человека (как и почти все чаты). системы работают).

Обычно основной список пользовательского интерфейса содержит смесь группового чата и чатов 1:1 (все GroupChannel).

 --------------------------------
|    Search Chat TextField       |
|--------------------------------|
|1  John (1:1)                   |
|2  John's Birthday Plan (group) |
|3  Johnney Eve (1:1)            |
|4  Johansson Fans (group)       |
|  ...                           |
 --------------------------------

Все предметы технически GroupChannel. Обратите внимание, что все чаты 1:1 не имеют фактических name, как показано в списке. Имя, показанное в списке, принадлежит другому человеку nickname.

Ожидание:

Теперь, если пользователь ищет что-то вроде joh, он должен вернуть все групповые чаты, чье имя содержит joh ИЛИ все чаты 1:1, в которых имя другого человека содержит joh. (В основном все элементы, показанные в приведенном выше примере.)

Моя попытка:

Мое первоначальное решение для достижения этой цели состоит в том, чтобы сохранить имя канала 1:1 как <user1 nickname> & <user2 nickname>, поэтому, когда пользователь ищет другого пользователя по его имени, канал 1:1 будет отображаться так же, как групповой канал.

Пример кода:

query = SBDGroupChannel.createMyGroupChannelListQuery()
query?.order = .latestLastMessage
query?.limit = 30
query?.channelNameContainsFilter = "joh"
query.loadNextPage(...)

Проблема:

Проблема с этим:

  1. Если пользователь ищет свое имя (или просто символ-разделитель &, или просто пробел), то будет виден и весь личный чат, что не имеет значения.
  2. Моя система позволяет пользователю изменять свой псевдоним, поэтому каждый раз, когда пользователь меняет свой псевдоним, все имена каналов 1: 1 должны обновляться (что болезненно).

person Sunil Chauhan    schedule 08.02.2021    source источник
comment
Вы можете добавить локальный фильтр к результатам поиска, возвращаемым для sendbird, и удалить каналы с вашим именем пользователя и т. д.   -  person Mohit Kumar    schedule 09.02.2021
comment
Это тоже может не сработать, так как одновременно у меня могут не быть все каналы локально (из-за функции разбиения на страницы).   -  person Sunil Chauhan    schedule 09.02.2021


Ответы (1)


Сунил,

Обычно, когда вы получаете список групповых каналов для пользователя, он извлекает все каналы, частью которых потенциально является пользователь (в зависимости от memberStateFilter).

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

Давайте рассмотрим пример, предположим, что ваш userId — Джон, и вы ищете чат с Джеем:

let listQuery = SBDGroupChannel.createMyGroupChannelListQuery()
listQuery?.userIdsExactFilter = ["John", "Jay"]
listQuery?.loadNextPage(completionHandler: { (groupChannels, error) in
guard error == nil else {
    // Handle error.
}

// Only channelA is returned in a result list through the "list" parameter of the callback method.
...
})

Если вы хотите явно использовать псевдонимы:

let listQuery = SBDGroupChannel.createMyGroupChannelListQuery()
listQuery?.nicknameContainsFilter = ["John", "Jay"]
listQuery?.loadNextPage(completionHandler: { (groupChannels, error) in
guard error == nil else {
    // Handle error.
}

// Only channelA is returned in a result list through the "list" parameter of the callback method.
...
})

Вы упомянули, что разрешаете пользователям менять свои никнеймы, и поэтому комнаты необходимо обновлять. Возможно, стоит дать вашим групповым каналам (даже 1:1) общие имена, а затем динамически генерировать отображаемое имя для каждого чата. Поскольку каждый канал возвращает список участников, вы можете просмотреть массив участников, отфильтровать пользователя, вошедшего в систему, а затем извлечь псевдоним оставшегося пользователя из массива. Это гарантирует, что независимо от того, на что пользователь изменит свой псевдоним, он всегда будет точным, и вам не придется обновлять каждый канал, когда пользователь обновляет свой псевдоним.

************ Обновлено 10 февраля *************

Спасибо за предоставленный пример того, чего вы хотите достичь. Похоже, вы пытаетесь найти как channelNameContainsFilter, так и nicknameContainsFilter, используя оператор ИЛИ. Это не то, что мы (Sendbird) в настоящее время поддерживаем в iOS SDK. Итак, вопрос в том, что вы могли бы сделать, чтобы достичь этого?

Одним из вариантов может быть использование API платформы для получения этой информации. Список каналов моей группы имеет параметры search_query и search_fields, которые позволят вам использовать этот оператор OR для поиска как имен каналов, так и псевдонимов, соответствующих вашему значению.

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

В качестве примечания, Stackoverflow может быть не лучшим местом для такого рода дискуссий, так как там много переписки. Пожалуйста, не стесняйтесь присоединиться к нам в нашем сообществе для получения дополнительной поддержки.

person Tyler Hammer    schedule 09.02.2021
comment
1-е решение (фильтрация с помощью идентификаторов пользователей) не будет работать; поскольку пользователь ищет имя и сопоставление имени: идентификатор не доступен сразу (мне нужно сделать запрос API, чтобы получить идентификатор пользователя). - person Sunil Chauhan; 09.02.2021
comment
Если я использую nicknameContainsFilter, то он вернет все другие каналы, имя которых не соответствует поисковому запросу пользователя, и участники имеют этот никнейм. Мое намерение состоит в том, чтобы позволить пользователю искать строку, которая будет искать имя канала и другого пользователя в чате 1: 1. - person Sunil Chauhan; 09.02.2021
comment
Я не разделяю вашего беспокойства по поводу nicknameContainsFilter. Целью этого является поиск чатов, которые содержат участников с псевдонимами в фильтре. В вашем контексте вы должны включить псевдоним пользователя, вошедшего в систему, и псевдоним пользователя, которого вы ищете. Это возвращает любой канал (каналы), который включает обоих пользователей. Если вы хотите использовать имя канала, вы можете использовать channelNameContainsFilter, но тогда вы столкнетесь с проблемами при обновлении каналов с псевдонимами. - person Tyler Hammer; 10.02.2021
comment
Извини, Тайлер, возможно, я не очень ясно выразился по этому вопросу. Я обновил вопрос с примером. - person Sunil Chauhan; 10.02.2021
comment
Я обновил свой ответ новой информацией, основанной на ваших изменениях. - person Tyler Hammer; 10.02.2021
comment
Спасибо за подробные обновления. Я присоединился к сообществу SendBird. :) - person Sunil Chauhan; 11.02.2021