Converse 从 API 打开聊天
Converse opening a chat from API
我正在研究通过 API.
与用户开启聊天 window 的方法
我已经设置(并在白名单中注册)了一个插件,它会触发。
converse.plugins.add('startChat', {
initialize: function () {
this._converse.on('connected', function () {
console.log("wibble");
this._converse.api.chats.open('user@chat.domain.com');
});
}
});
这正在触发,但没有发起聊天。我在控制台中收到以下错误:
wibble
converse.js:48049
FATAL: TypeError: Cannot read property 'get' of undefined
at child.createChatBox (/converse.js:50015:56)
at child.getChatBox (/converse.js:50050:40)
at Object.open (/converse.js:50153:84)
at Object.<anonymous> (Page.aspx:1264:41)
at triggerEvents (/converse.js:46015:57)
at triggerApi (/converse.js:46003:19)
at eventsApi (/converse.js:45802:16)
at Object.Events.trigger (/converse.js:45993:5)
at Object._converse.emit (/converse.js:48071:27)
at Object.onConnected (/converse.js:48671:27)
converse.js:48041
ERROR: User connection callback caused an exception: TypeError: Cannot read property 'get' of undefined
首先,Converse.js 不允许与不在您名册中的用户进行聊天(除非您已将 allow_non_roster_messaging 设置为 true
)。因此,请确保您尝试与之聊天的用户在您的名册中。
其次,在 connection
事件触发后立即尝试打开聊天还为时过早。
所以你必须先等到花名册被填满。这是rosterContactsFetchedevent/promise.
除此之外,最好先等到已经打开的聊天框(缓存在 sessionStorage 中)也从缓存中取出。这是chatBoxesFetchedevent/promise.
这两个事件在每个会话中只触发一次,因此它们也可以作为 promises 使用。
首先等待这两个承诺的解决,因此您的代码将如下所示:
converse.plugins.add('startChat', {
initialize: function() {
var _converse = this._converse;
Promise.all([
_converse.api.waitUntil('rosterContactsFetched'),
_converse.api.waitUntil('chatBoxesFetched')
]).then(function() {
// Note, test@conversejs.org must be in your contacts roster!
_converse.api.chats.open('test@conversejs.org');
});
}
});
这是一个运行上述代码的 JSFiddle:https://jsfiddle.net/jcbrand/5juvrL3c/
对于未来的旅行者:我解决了从 converse 外部开始 converse 聊天的问题,如下所示:
<li id="start-chat" data-id="idOfTheUser" data-name="nameOfTheUser"> Message</li>
然后像这样的插件:
converse.plugins.add('startChat', {
initialize: function () {
var _converse = this._converse;
$('#start-chat').on('click', function () {
var jid = $('#start-chat').attr("data-id") +'@chat.domain.com';
var userFullName = $('#start-chat').attr("data-name");
_converse.api.contacts.add(jid, userFullName);
_converse.api.chats.open(jid, true);
});
}
});
我正在研究通过 API.
与用户开启聊天 window 的方法我已经设置(并在白名单中注册)了一个插件,它会触发。
converse.plugins.add('startChat', {
initialize: function () {
this._converse.on('connected', function () {
console.log("wibble");
this._converse.api.chats.open('user@chat.domain.com');
});
}
});
这正在触发,但没有发起聊天。我在控制台中收到以下错误:
wibble
converse.js:48049
FATAL: TypeError: Cannot read property 'get' of undefined
at child.createChatBox (/converse.js:50015:56)
at child.getChatBox (/converse.js:50050:40)
at Object.open (/converse.js:50153:84)
at Object.<anonymous> (Page.aspx:1264:41)
at triggerEvents (/converse.js:46015:57)
at triggerApi (/converse.js:46003:19)
at eventsApi (/converse.js:45802:16)
at Object.Events.trigger (/converse.js:45993:5)
at Object._converse.emit (/converse.js:48071:27)
at Object.onConnected (/converse.js:48671:27)
converse.js:48041
ERROR: User connection callback caused an exception: TypeError: Cannot read property 'get' of undefined
首先,Converse.js 不允许与不在您名册中的用户进行聊天(除非您已将 allow_non_roster_messaging 设置为 true
)。因此,请确保您尝试与之聊天的用户在您的名册中。
其次,在 connection
事件触发后立即尝试打开聊天还为时过早。
所以你必须先等到花名册被填满。这是rosterContactsFetchedevent/promise.
除此之外,最好先等到已经打开的聊天框(缓存在 sessionStorage 中)也从缓存中取出。这是chatBoxesFetchedevent/promise.
这两个事件在每个会话中只触发一次,因此它们也可以作为 promises 使用。
首先等待这两个承诺的解决,因此您的代码将如下所示:
converse.plugins.add('startChat', {
initialize: function() {
var _converse = this._converse;
Promise.all([
_converse.api.waitUntil('rosterContactsFetched'),
_converse.api.waitUntil('chatBoxesFetched')
]).then(function() {
// Note, test@conversejs.org must be in your contacts roster!
_converse.api.chats.open('test@conversejs.org');
});
}
});
这是一个运行上述代码的 JSFiddle:https://jsfiddle.net/jcbrand/5juvrL3c/
对于未来的旅行者:我解决了从 converse 外部开始 converse 聊天的问题,如下所示:
<li id="start-chat" data-id="idOfTheUser" data-name="nameOfTheUser"> Message</li>
然后像这样的插件:
converse.plugins.add('startChat', {
initialize: function () {
var _converse = this._converse;
$('#start-chat').on('click', function () {
var jid = $('#start-chat').attr("data-id") +'@chat.domain.com';
var userFullName = $('#start-chat').attr("data-name");
_converse.api.contacts.add(jid, userFullName);
_converse.api.chats.open(jid, true);
});
}
});