gpt4 book ai didi

angular - 在 Ionic3 中使用 Pubnub 为一对一聊天创建 channel

转载 作者:太空狗 更新时间:2023-10-29 18:30:11 24 4
gpt4 key购买 nike

我已经使用 pubnub 在 Ionic3 中实现了聊天。它在群聊中工作正常。用于群聊的 channel 是“group1-ch”。我在这里添加了我的代码。我在开发一对一聊天时遇到了一些困难。

发布服务

import {Injectable, EventEmitter} from '@angular/core';
declare var PUBNUB;
type OnMessageFn = (message, envelope, channelOrGroup, time, channel) => void;

export enum PubNubEventType {
MESSAGE,
CONNECT,
DISCONNECT,
RECONNECT,
PUBLISHED,
HISTORY,
PRESENCE
}

export class PubNubEvent {
constructor(public type: PubNubEventType, channel:string, public value: any) {}
}

@Injectable()
export class PubNubService {

pubnub:any;

/**
* Call this method after platform becomes to be ready
*/
// init() {
constructor() {

}
connectionuuid(uuid){
this.pubnub = PUBNUB({

subscribe_key: '*********************************',
publish_key: '*********************************',
uuid:uuid,
ssl: true,
secret_key: '**************************************'

});
}

subscribe(channel:string):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.subscribe({
channel : channel,
withPresence: true,
presence : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PRESENCE, channel, message));
},
message : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.MESSAGE, channel, message));
},
connect: (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.CONNECT, channel, message));
},
disconnect: (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.DISCONNECT, channel, message));
},
reconnect: (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.RECONNECT, channel, message));
},
error: (error) => {
eventEmitter.error(error);
},
});
return eventEmitter;
}

publish(channel:string, message:any, store_in_history:boolean = true):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.publish({
channel: channel,
message: message,
store_in_history: store_in_history,
callback : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PUBLISHED, channel, message));
},
// Executes on a publish error.
error: (error) => {
eventEmitter.error(error);
}
});
return eventEmitter;
}

individual_chat(channel:string, message:any, store_in_history:boolean = true):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.publish({
channel: channel,
message: message,
store_in_history: store_in_history,
callback : (message) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PUBLISHED, channel, message));
},
// Executes on a publish error.
error: (error) => {
eventEmitter.error(error);
}
});
return eventEmitter;
}

history(channel: string, count:number = 100, start:number = null, end:number = null, reverse:boolean = true, include_token: boolean = true):EventEmitter<PubNubEvent> {
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.history({
channel: channel,
callback: (messages) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.HISTORY, channel, messages));
},
error: (error) => {
eventEmitter.error(error);
},
count: count,
start: start,
end: end,
reverse: reverse,
include_token: include_token
});
return eventEmitter;
}

here_now(channel: string, count:number = 100, start:number = null, end:number = null, reverse:boolean = true, include_token: boolean = true):EventEmitter<PubNubEvent>{
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.here_now({
channel: channel,
callback: (m) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PRESENCE, channel, m));
},
error: (error) => {
eventEmitter.error(error);
},
count: count,
start: start,
end: end,
reverse: reverse,
include_token: include_token
});
return eventEmitter;
}
where_now(channel: string, count:number = 100, start:number = null, end:number = null, reverse:boolean = true, include_token: boolean = true):EventEmitter<PubNubEvent>{
let eventEmitter:EventEmitter<PubNubEvent> = new EventEmitter<PubNubEvent>();
this.pubnub.where_now({
uuid: channel,
callback: (m) => {
eventEmitter.emit(new PubNubEvent(PubNubEventType.PRESENCE, channel, m));
},
error: (error) => {
eventEmitter.error(error);
},
count: count,
start: start,
end: end,
reverse: reverse,
include_token: include_token
});
return eventEmitter;
}
}

我的需求

  1. 谁能告诉我如何为一对一聊天创建“ channel ”?
  2. 接收方如何知道发送方使用的是哪个 channel ?

感谢和问候

阿南德·拉吉

最佳答案

高级聊天邀请设计模式

让我使用更具体的名字:Anand、Craig、John。每个用户都应订阅一个入站 channel ,他们会收到有关邀请的通知:

  • Anand 订阅 inbound.anand
  • Craig 订阅了 inbound.craig
  • John 订阅了 inbound.john

现在,如果您知道要联系的用户名,就可以随时知道向另一个入站 channel 发送(发布)邀请的 channel 。您可以发送消息邀请他们聊天并提供 channel 作为单独的值:

{
"message": "Hi, this is Anand. I would like to invite you to chat with me.",
"chat_channel": "abc123",
"sender_id": "anand"
}

这只是一个简单的示例消息,可以更复杂,但要点是,您想向要邀请的人发送消息并提供 channel 名称(它可以是随机生成的字符串或类似 andand_craig 的内容,只要它是 Anand 和 Craig 使用唯一用户名的唯一 channel 名称即可)。

您的用户界面将为受邀用户提供一种方式,让他们可以单击接受拒绝 按钮来响应邀请。

  • 如果点击接受,那么受邀用户将发布一条消息返回到 inbox.anand 或提供的 chat_channelanand 已经订阅,然后订阅提供的 chat_channel,开始与 anand 聊天。

这是相当简化的设计模式,但应该提供一些关于如何在两个人甚至一群人之间发起对话的见解。

有关推荐设计模式的更多详细信息:

您还可以考虑使用 PubNub's ChatEngine framework它具有内置的聊天功能。对于 Angular,请参阅 Simple Angular ChatEngine example .

关于angular - 在 Ionic3 中使用 Pubnub 为一对一聊天创建 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48092614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com