Толкатель один к одному структура чата

я немного запутался presence-channels в платформе Pusher, так как я создаю приложение чата с нуля. Теперь я знаю, что некоторые из вас, ребята, видели тонны тем "чат-приложения в реальном времени", но я ищу одноранговый чат, а не глобальную вещь на сайте. Больше похоже на чат facebook, где вы можете пойти один-на-один.

теперь я видел пример в демонстрациях PubNub (по имени Babel), но эта вещь далека от того, что я ищу, потому что я проверил запросы в консоль и даже если она не отображается, отправленные сообщения между другими пользователями также отображаются в журналах сетевых запросов, потому что она фильтруется в JS, а не на стороне сервера, и это не то, что я хочу точно.

Итак, возвращаясь к теме, Я знаю о функциональности канала / private-channel / presence channel, и я решил сделать это:

  • при открытии приложения каждый пользователь подписывается на его private-user_id канал ( создает, если это не существовать уже.)

  • в то же время ( при открытии приложения ) user1 поддерживает presence-global канал, где другие отслеживают, если друзья онлайн.

  • когда другие хотят, чтобы отправить ему сообщение, например,user2 до user1, он присоединяется к private-1 после этого javascript будет обрабатывать события.

теперь я знаю, что что-то не так с этим, потому что.. если user3 отправил бы сообщение user1 Он подписаться на private-user1 так что я думаю, он увидит события, которые user2 срабатывает при отправке сообщений в user1 тоже, верно ? Или я неправильно понял ?

я читал в их docs это presence канал на самом деле private расширение канала, поэтому я сейчас думаю.. зачем использовать private каналы больше, а затем, как я могу уведомить всех своих друзей, что я онлайн.

но тогда в их docs , сказав мне это channels обеспечить две важные вещи (среди прочих), из которых, во-первых,a way of filtering data и a way of controlling access.

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

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

спасибо заранее !

1 ответов


цель частные каналы - ограничить, кто может подписаться на этот канал. Итак, вы можете либо:

  1. используйте его, чтобы гарантировать, что только друзья пользователей могут подписаться на обновления
  2. использовать его для уведомлений только для этого пользователя

в чате один на один я бы предложил вам выбрать последний (№2).

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

в Форум

когда пользователи присоединяются к приложению чата, они все подписываются на два канала:

  1. private-notifications-<user_id> здесь user_id это их уникальный идентификатор пользователя, например,leggetter в моем случае. Этот канал используется для пользовательских уведомлений.
  2. presence-forum для всех пользователей на этом форуме. Вопрос назывался это presence-global.

это достигается следующим образом:

var notifications = pusher.subscribe( 'private-notifications-user_one' );
var forum = pusher.subscribe( 'presence-forum' );

при подписке на каждый канал канал проверка подлинности процесс будет иметь место.

в рамках форума вы можете иметь общий публичный чат на presence-forum/presence-global наличие канала путем отправки и получения сообщений.

запуск один-к-одному чат

когда один пользователь (user_one) хочет иметь приватный чат с другим пользователем (user_two) Вам, очевидно, нужно что-то в пользовательском интерфейсе, чтобы вызвать это. Скажи user_one нажимает на что-то рядом с user_two это означает, что они хотят один на один. Когда это происходит, необходимо сделать запрос на сервер (орган), чтобы указать, что user_one хочет начать приватный чат с user_two†.

Примечание: † если вы выбрали соглашение об именовании канала для чата один к одному, аутентификация частного канала может фактически использоваться как частная инициация чата один к одному

когда сервер получает этот запрос, он может создать уникальный закрытый канал имя один на один. Действительно простой способ сделать это-объединить идентификаторы пользователей, например private-chat-<initiating_user>-<receiving_user> (есть и другие соображения, например, возможно, вы хотите, чтобы имя канала всегда было одинаковым между двумя пользователями). В нашем простом сценарии название канала будет private-chat-user_one-user_two.

сервер может затем вызвать one-to-one-chat-request событие на приватном канале уведомлений для каждого пользователя, предоставляющего имя приватного канала чата один к одному в полезной нагрузке.

// Trigger event on both user channels with one call
var channels = [ 'private-notifications-user_one', 'private-notifications-user_two' ];
// Additional event data could also be sent
// e.g. more info on the initiating user
var eventData = {
                  'channel_name': 'private-chat-user_one-user_two',
                  'initiated_by': 'user_one'
                  'chat_with'   : 'user_two'
                };
pusher.trigger( channels, 'one-to-one-chat-request', eventData );

когда user_one получает one-to-one-chat-request они подпишутся на eventData.channel_name канал и auth process состоится для этого канала.

// A lookup of private chats
// where the key is the user ID of the current user is chatting with
var privateChats = {};
notifications.bind( 'one-to-one-chat-request', function( data ) {

  // MY_USER_ID would need to be stored somewhere
  // and in this case the value would be 'user_one'.
  // expectingChatWith should make sure user_one is waiting for
  // a private chat response with the given user
  if( data.initiated_by === MY_USER_ID &&
      expectingChatWith( data.chat_with ) ) {
    startPrivateChat( data.chat_with, data.channel_name );
  }

} );

function startPrivateChat( withUserId, channelName ) {
  privateChats[ withUserId ] = pusher.subscribe( channelName );
}

, когда user_two получает one-to-one-chat-request пользователь должен быть уведомлен о просьбе и принимать или падение его. Если пользователь принимает, то клиентский код просто подписывается на канал. Если пользователь отклоняет, то на сервер должен быть отправлен запрос и событие срабатывает на private-notifications-user_one говоря им, что их запрос на чат один к одному был отклонен. Это позволит user_one отказаться от подписки на приватный канал чата.

var privateChats = {};
notifications.bind( 'one-to-one-chat-request', function( data ) {

  if( ... ) { ... }
  // has somebody request to chat with this user?
  else if( data.chatWith === MY_USER_ID ) {
    // Prompt the user
    // Note: more user info required
    displayChatPrompt( data );
  }

} );

// callback when the user accepts the chat request
function accepted( chatUserId, channelName ) {
  startPrivateChat( chatUserId, channelName );
}

// the user doesn't want to chat
function declined( chatUserId ) {
  // send info to the server indicating declined request
}

частный один-к-одному чат успех

С user_one и user_two подписка private-chat-user_one-user_two они могут запускать события на канале и участвовать в их приватный чат один на один.