私有频道的目的是限制可以订阅该频道的用户。因此,您可以选择以下两种方式之一:
- 使用它来确保只有用户的朋友可以订阅更新
- 仅为该用户使用通知
在一对一聊天中,我建议您选择后者(第2种)。
考虑到这一点,我会按照以下方式实现一对一聊天:
论坛
当用户加入聊天应用程序时,他们都会订阅两个频道:
private-notifications-<user_id>
,其中user_id
是他们的唯一用户ID,例如我的情况下是leggetter
。该频道用于特定于用户的通知。
presence-forum
适用于该论坛中的所有用户。问题称其为presence-global
。
实现方法如下:
var notifications = pusher.subscribe( 'private-notifications-user_one' );
var forum = pusher.subscribe( 'presence-forum' );
在订阅每个频道时,将进行
频道身份验证过程。
在论坛中,您可以通过发送和接收消息,在
presence-forum
/
presence-global
presence channel上进行公共聊天。
开始一对一聊天
当一个用户(
user_one
)想要与另一个用户(
user_two
)私聊时,您需要在UI中触发此操作。例如,
user_one
点击
user_two
旁边的某些内容,表示他们想要一对一聊天。当这种情况发生时,应向服务器(权威机构)发出请求,指示
user_one
希望与
user_two
启动私人聊天†。
注意:†如果您选择了一对一聊天的频道命名约定,则私人频道身份验证实际上可以用作私人一对一聊天初始化。
当服务器收到此请求时,它可以为此一对一聊天生成唯一的私人频道名称。一种非常简单的方法是通过连接用户ID,例如
private-chat-<initiating_user>-<receiving_user>
(还有其他考虑因素,例如您可能希望确保频道名称在两个用户之间始终相同)。在我们的简单场景中,频道名称将是
private-chat-user_one-user_two
。
然后,服务器可以在每个用户的私人通知频道上触发
one-to-one-chat-request
事件,在负载中提供一对一私人聊天频道名称。
var channels = [ 'private-notifications-user_one', 'private-notifications-user_two' ];
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
频道,并且该频道的
身份验证过程将会进行。
var privateChats = {};
notifications.bind( 'one-to-one-chat-request', function( data ) {
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( ... ) { ... }
else if( data.chatWith === MY_USER_ID ) {
displayChatPrompt( data );
}
} );
function accepted( chatUserId, channelName ) {
startPrivateChat( chatUserId, channelName );
}
function declined( chatUserId ) {
}
私人一对一聊天成功
当user_one
和user_two
都订阅了private-chat-user_one-user_two
频道后,他们可以在频道上触发事件并参与他们的私人一对一聊天。