Толкатель один к одному структура чата
я немного запутался 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 ответов
цель частные каналы - ограничить, кто может подписаться на этот канал. Итак, вы можете либо:
- используйте его, чтобы гарантировать, что только друзья пользователей могут подписаться на обновления
- использовать его для уведомлений только для этого пользователя
в чате один на один я бы предложил вам выбрать последний (№2).
имея это в виду, я бы поставил достижение один-к-одному чат следующим образом:
в Форум
когда пользователи присоединяются к приложению чата, они все подписываются на два канала:
-
private-notifications-<user_id>
здесьuser_id
это их уникальный идентификатор пользователя, например,leggetter
в моем случае. Этот канал используется для пользовательских уведомлений. -
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
они могут запускать события на канале и участвовать в их приватный чат один на один.