我对Pusher平台上的presence-channels
感到有点困惑,因为我正在从头开始构建聊天应用程序。现在,我知道你们中的一些人已经看到了大量的实时聊天应用程序"围绕着,但是,我正在寻找点对点聊天,而不是整个网站的全球性事物。更像是一个Facebook聊天,你可以在那里一对一。
现在,我在PubNub的演示(名为Babel)中看到了一个例子,但是,这件事远远不是我想要的,因为我已经检查过了控制台,即使它没有显示,其他用户之间发送的消息也显示在我的网络请求日志中,因为它在JS中而不是服务器端进行过滤,这不是我想要的。
所以,回到这个主题, 我知道频道/私人频道/在线频道功能,我决定这样做:
打开应用时,每个用户都会订阅他的private-user_id
频道(如果已经存在,则会创建)。
同时(在打开应用时)user1
订阅presence-global
频道,其他人会在朋友在线时跟踪。
当其他人想要向他发送消息时,例如user2
到user1
,他订阅private-1
此后javascript将处理这些事件。
现在,我知道这有什么问题,因为..如果user3
会向user1
发送消息,他会订阅private-user1
所以我猜他和他#39; lll会看到user2
向user1
发送邮件时触发的事件,对吧?或者我错了吗?
我已经在他们的文档中读到presence
频道实际上是private
频道扩展,所以我现在在思考..为什么要使用{ {1}}频道,然后,我怎样才能通知我在线的所有朋友。
然而,他们的 docs 中出现了一些其他内容,告诉我private
提供了两个重要的事情(其中包括),首先是channels
和第二个是a way of filtering data
。
我应该如何"过滤数据"因为他们的文档中没有链接,或者更好,你在一对一的聊天中有什么想法。对不起,如果我的所有文档都错了,我看看他们的示例应用程序,但他们都没有使用我正在寻找的一对一技术。
我是Pusher和socket连接等的新手,但我已经学会了如何验证,如何创建,检测和处理频道中的事件,我可以与在线成员创建一个简单的全局聊天,但是当谈到私人频道时,我对如何为两个用户创建单独的频道感到很困惑。
提前致谢!
答案 0 :(得分:18)
private channels的目的是限制谁可以订阅该频道。所以,您可以:
在一对一聊天中,我建议您选择后者(第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' );
订阅每个频道后,channel authentication进程将会发生。
在论坛中,您可以通过发送和接收邮件在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
事件。
// 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
,他们可以在频道上触发事件并参与他们的私人一对一聊天。< / p>