Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
converse.js
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
converse.js
Commits
030c26a8
Commit
030c26a8
authored
Mar 31, 2020
by
JC Brand
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use `api` shortcut instead of `_converse.api`
parent
d057177f
Changes
33
Hide whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
801 additions
and
767 deletions
+801
-767
src/converse-bookmark-views.js
src/converse-bookmark-views.js
+9
-9
src/converse-chatboxviews.js
src/converse-chatboxviews.js
+11
-10
src/converse-chatview.js
src/converse-chatview.js
+45
-44
src/converse-controlbox.js
src/converse-controlbox.js
+44
-43
src/converse-dragresize.js
src/converse-dragresize.js
+13
-12
src/converse-emoji-views.js
src/converse-emoji-views.js
+10
-9
src/converse-headlines-view.js
src/converse-headlines-view.js
+4
-3
src/converse-message-view.js
src/converse-message-view.js
+9
-8
src/converse-minimize.js
src/converse-minimize.js
+15
-14
src/converse-muc-views.js
src/converse-muc-views.js
+32
-31
src/converse-notification.js
src/converse-notification.js
+12
-11
src/converse-oauth.js
src/converse-oauth.js
+8
-6
src/converse-omemo.js
src/converse-omemo.js
+25
-24
src/converse-profile.js
src/converse-profile.js
+11
-10
src/converse-push.js
src/converse-push.js
+13
-12
src/converse-register.js
src/converse-register.js
+18
-17
src/converse-roomslist.js
src/converse-roomslist.js
+10
-9
src/converse-rosterview.js
src/converse-rosterview.js
+31
-30
src/headless/converse-bookmarks.js
src/headless/converse-bookmarks.js
+21
-20
src/headless/converse-bosh.js
src/headless/converse-bosh.js
+12
-11
src/headless/converse-chat.js
src/headless/converse-chat.js
+60
-59
src/headless/converse-chatboxes.js
src/headless/converse-chatboxes.js
+19
-18
src/headless/converse-disco.js
src/headless/converse-disco.js
+88
-87
src/headless/converse-emoji.js
src/headless/converse-emoji.js
+10
-9
src/headless/converse-headlines.js
src/headless/converse-headlines.js
+14
-13
src/headless/converse-mam.js
src/headless/converse-mam.js
+37
-36
src/headless/converse-muc.js
src/headless/converse-muc.js
+98
-97
src/headless/converse-ping.js
src/headless/converse-ping.js
+17
-15
src/headless/converse-pubsub.js
src/headless/converse-pubsub.js
+4
-3
src/headless/converse-roster.js
src/headless/converse-roster.js
+41
-40
src/headless/converse-smacks.js
src/headless/converse-smacks.js
+18
-17
src/headless/converse-status.js
src/headless/converse-status.js
+25
-24
src/headless/converse-vcard.js
src/headless/converse-vcard.js
+17
-16
No files found.
src/converse-bookmark-views.js
View file @
030c26a8
...
...
@@ -65,14 +65,14 @@ converse.plugins.add('converse-bookmark-views', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
hide_open_bookmarks
:
true
,
muc_respect_autojoin
:
true
});
...
...
@@ -96,7 +96,7 @@ converse.plugins.add('converse-bookmark-views', {
*/
ev
.
preventDefault
();
const
jid
=
ev
.
target
.
getAttribute
(
'
data-room-jid
'
);
_converse
.
api
.
rooms
.
open
(
jid
,
{
'
bring_to_foreground
'
:
true
});
api
.
rooms
.
open
(
jid
,
{
'
bring_to_foreground
'
:
true
});
_converse
.
chatboxviews
.
get
(
jid
).
renderBookmarkForm
();
},
});
...
...
@@ -203,7 +203,7 @@ converse.plugins.add('converse-bookmark-views', {
},
toHTML
()
{
const
is_hidden
=
b
=>
!!
(
_converse
.
api
.
settings
.
get
(
'
hide_open_bookmarks
'
)
&&
_converse
.
chatboxes
.
get
(
b
.
get
(
'
jid
'
)));
const
is_hidden
=
b
=>
!!
(
api
.
settings
.
get
(
'
hide_open_bookmarks
'
)
&&
_converse
.
chatboxes
.
get
(
b
.
get
(
'
jid
'
)));
return
tpl_bookmarks_list
({
'
_converse
'
:
_converse
,
'
bookmarks
'
:
this
.
model
,
...
...
@@ -231,7 +231,7 @@ converse.plugins.add('converse-bookmark-views', {
const
data
=
{
'
name
'
:
name
||
Strophe
.
unescapeNode
(
Strophe
.
getNodeFromJid
(
jid
))
||
jid
}
_converse
.
api
.
rooms
.
open
(
jid
,
data
,
true
);
api
.
rooms
.
open
(
jid
,
data
,
true
);
},
removeBookmark
:
_converse
.
removeBookmarkViaEvent
,
...
...
@@ -255,7 +255,7 @@ converse.plugins.add('converse-bookmark-views', {
/************************ BEGIN Event Handlers ************************/
const
initBookmarkViews
=
async
function
()
{
await
_converse
.
api
.
waitUntil
(
'
roomsPanelRendered
'
);
await
api
.
waitUntil
(
'
roomsPanelRendered
'
);
_converse
.
bookmarksview
=
new
_converse
.
BookmarksView
({
'
model
'
:
_converse
.
bookmarks
});
/**
* Triggered once the _converse.Bookmarks collection and _converse.BookmarksView view
...
...
@@ -263,11 +263,11 @@ converse.plugins.add('converse-bookmark-views', {
* @event _converse#bookmarkViewsInitialized
* @example _converse.api.listen.on('bookmarkViewsInitialized', () => { ... });
*/
_converse
.
api
.
trigger
(
'
bookmarkViewsInitialized
'
);
api
.
trigger
(
'
bookmarkViewsInitialized
'
);
}
_converse
.
api
.
listen
.
on
(
'
bookmarksInitialized
'
,
initBookmarkViews
);
_converse
.
api
.
listen
.
on
(
'
chatRoomViewInitialized
'
,
view
=>
view
.
setBookmarkState
());
api
.
listen
.
on
(
'
bookmarksInitialized
'
,
initBookmarkViews
);
api
.
listen
.
on
(
'
chatRoomViewInitialized
'
,
view
=>
view
.
setBookmarkState
());
/************************ END Event Handlers ************************/
}
});
src/converse-chatboxviews.js
View file @
030c26a8
...
...
@@ -48,14 +48,15 @@ converse.plugins.add('converse-chatboxviews', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
promises
.
add
([
'
chatBoxViewsInitialized
'
]);
api
.
promises
.
add
([
'
chatBoxViewsInitialized
'
]);
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
animate
'
:
true
,
'
theme
'
:
'
default
'
});
...
...
@@ -74,7 +75,7 @@ converse.plugins.add('converse-chatboxviews', {
if
(
el
===
null
)
{
el
=
document
.
createElement
(
'
div
'
);
el
.
setAttribute
(
'
id
'
,
'
conversejs
'
);
u
.
addClass
(
`theme-
${
_converse
.
api
.
settings
.
get
(
'
theme
'
)}
`
,
el
);
u
.
addClass
(
`theme-
${
api
.
settings
.
get
(
'
theme
'
)}
`
,
el
);
const
body
=
_converse
.
root
.
querySelector
(
'
body
'
);
if
(
body
)
{
body
.
appendChild
(
el
);
...
...
@@ -97,9 +98,9 @@ converse.plugins.add('converse-chatboxviews', {
bg
.
innerHTML
=
tpl_background_logo
();
}
const
body
=
document
.
querySelector
(
'
body
'
);
body
.
classList
.
add
(
`converse-
${
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)}
`
);
this
.
el
.
classList
.
add
(
`converse-
${
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)}
`
);
if
(
_converse
.
api
.
settings
.
get
(
"
singleton
"
))
{
body
.
classList
.
add
(
`converse-
${
api
.
settings
.
get
(
"
view_mode
"
)}
`
);
this
.
el
.
classList
.
add
(
`converse-
${
api
.
settings
.
get
(
"
view_mode
"
)}
`
);
if
(
api
.
settings
.
get
(
"
singleton
"
))
{
this
.
el
.
classList
.
add
(
`converse-singleton`
);
}
this
.
render
();
...
...
@@ -133,7 +134,7 @@ converse.plugins.add('converse-chatboxviews', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
{
_converse
.
chatboxviews
=
new
_converse
.
ChatBoxViews
({
'
model
'
:
_converse
.
chatboxes
});
...
...
@@ -142,17 +143,17 @@ converse.plugins.add('converse-chatboxviews', {
* @event _converse#chatBoxViewsInitialized
* @example _converse.api.listen.on('chatBoxViewsInitialized', () => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxViewsInitialized
'
);
api
.
trigger
(
'
chatBoxViewsInitialized
'
);
});
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
_converse
.
chatboxviews
.
closeAllChatBoxes
());
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
_converse
.
chatboxviews
.
closeAllChatBoxes
());
function
calculateViewportHeightUnit
()
{
const
vh
=
window
.
innerHeight
*
0.01
;
document
.
documentElement
.
style
.
setProperty
(
'
--vh
'
,
`
${
vh
}
px`
);
}
_converse
.
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
calculateViewportHeightUnit
());
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
calculateViewportHeightUnit
());
window
.
addEventListener
(
'
resize
'
,
()
=>
calculateViewportHeightUnit
());
/************************ END Event Handlers ************************/
}
...
...
src/converse-chatview.js
View file @
030c26a8
...
...
@@ -56,9 +56,10 @@ converse.plugins.add('converse-chatview', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
auto_focus
'
:
true
,
'
message_limit
'
:
0
,
'
show_send_button
'
:
false
,
...
...
@@ -91,7 +92,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBox }
* @example _converse.api.listen.on('userDetailsModalInitialized', chatbox => { ... });
*/
_converse
.
api
.
trigger
(
'
userDetailsModalInitialized
'
,
this
.
model
);
api
.
trigger
(
'
userDetailsModalInitialized
'
,
this
.
model
);
},
toHTML
()
{
...
...
@@ -126,7 +127,7 @@ converse.plugins.add('converse-chatview', {
const
refresh_icon
=
this
.
el
.
querySelector
(
'
.fa-refresh
'
);
u
.
addClass
(
'
fa-spin
'
,
refresh_icon
);
try
{
await
_converse
.
api
.
vcard
.
update
(
this
.
model
.
contact
.
vcard
,
true
);
await
api
.
vcard
.
update
(
this
.
model
.
contact
.
vcard
,
true
);
}
catch
(
e
)
{
log
.
fatal
(
e
);
this
.
alert
(
__
(
'
Sorry, something went wrong while trying to refresh
'
),
'
danger
'
);
...
...
@@ -149,7 +150,7 @@ converse.plugins.add('converse-chatview', {
()
=>
this
.
model
.
contact
.
destroy
(),
(
err
)
=>
{
log
.
error
(
err
);
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
[
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
[
__
(
'
Sorry, there was an error while trying to remove %1$s as a contact.
'
,
this
.
model
.
contact
.
getDisplayName
())
]);
...
...
@@ -229,7 +230,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('chatBoxViewInitialized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxViewInitialized
'
,
this
);
api
.
trigger
(
'
chatBoxViewInitialized
'
,
this
);
},
initDebounced
()
{
...
...
@@ -269,7 +270,7 @@ converse.plugins.add('converse-chatview', {
},
renderToolbar
()
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
show_toolbar
'
))
{
if
(
!
api
.
settings
.
get
(
'
show_toolbar
'
))
{
return
this
;
}
const
options
=
Object
.
assign
(
...
...
@@ -285,7 +286,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('renderToolbar', view => { ... });
*/
_converse
.
api
.
trigger
(
'
renderToolbar
'
,
this
);
api
.
trigger
(
'
renderToolbar
'
,
this
);
return
this
;
},
...
...
@@ -294,13 +295,13 @@ converse.plugins.add('converse-chatview', {
form_container
.
innerHTML
=
tpl_chatbox_message_form
(
Object
.
assign
(
this
.
model
.
toJSON
(),
{
'
__
'
:
__
,
'
message_limit
'
:
_converse
.
api
.
settings
.
get
(
'
message_limit
'
),
'
message_limit
'
:
api
.
settings
.
get
(
'
message_limit
'
),
'
hint_value
'
:
this
.
el
.
querySelector
(
'
.spoiler-hint
'
)?.
value
,
'
label_message
'
:
this
.
model
.
get
(
'
composing_spoiler
'
)
?
__
(
'
Hidden message
'
)
:
__
(
'
Message
'
),
'
label_spoiler_hint
'
:
__
(
'
Optional hint
'
),
'
message_value
'
:
this
.
el
.
querySelector
(
'
.chat-textarea
'
)?.
value
,
'
show_send_button
'
:
_converse
.
api
.
settings
.
get
(
'
show_send_button
'
),
'
show_toolbar
'
:
_converse
.
api
.
settings
.
get
(
'
show_toolbar
'
),
'
show_send_button
'
:
api
.
settings
.
get
(
'
show_send_button
'
),
'
show_toolbar
'
:
api
.
settings
.
get
(
'
show_toolbar
'
),
'
unread_msgs
'
:
__
(
'
You have unread messages
'
)
}));
this
.
el
.
addEventListener
(
'
focusin
'
,
ev
=>
this
.
emitFocused
(
ev
));
...
...
@@ -346,7 +347,7 @@ converse.plugins.add('converse-chatview', {
},
async
addFileUploadButton
()
{
if
(
await
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
HTTPUPLOAD
,
_converse
.
domain
))
{
if
(
await
api
.
disco
.
supports
(
Strophe
.
NS
.
HTTPUPLOAD
,
_converse
.
domain
))
{
if
(
this
.
el
.
querySelector
(
'
.chat-toolbar .upload-file
'
))
{
return
;
}
...
...
@@ -372,7 +373,7 @@ converse.plugins.add('converse-chatview', {
}
const
results
=
await
Promise
.
all
(
this
.
model
.
presence
.
resources
.
map
(
r
=>
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
SPOILER
,
`
${
contact_jid
}
/
${
r
.
get
(
'
name
'
)}
`
)
r
=>
api
.
disco
.
supports
(
Strophe
.
NS
.
SPOILER
,
`
${
contact_jid
}
/
${
r
.
get
(
'
name
'
)}
`
)
)
);
const
all_resources_support_spolers
=
results
.
reduce
((
acc
,
val
)
=>
(
acc
&&
val
),
true
);
...
...
@@ -429,9 +430,9 @@ converse.plugins.add('converse-chatview', {
'
i18n_title
'
:
__
(
'
See more information about this person
'
),
'
icon_class
'
:
'
fa-id-card
'
,
'
name
'
:
'
details
'
,
'
standalone
'
:
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
,
'
standalone
'
:
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
,
}];
if
(
!
_converse
.
api
.
settings
.
get
(
"
singleton
"
))
{
if
(
!
api
.
settings
.
get
(
"
singleton
"
))
{
buttons
.
push
({
'
a_class
'
:
'
close-chatbox-button
'
,
'
handler
'
:
ev
=>
this
.
close
(
ev
),
...
...
@@ -439,7 +440,7 @@ converse.plugins.add('converse-chatview', {
'
i18n_title
'
:
__
(
'
Close and end this conversation
'
),
'
icon_class
'
:
'
fa-times
'
,
'
name
'
:
'
close
'
,
'
standalone
'
:
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
,
'
standalone
'
:
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
,
});
}
return
buttons
;
...
...
@@ -456,9 +457,9 @@ converse.plugins.add('converse-chatview', {
'
label_clear
'
:
__
(
'
Clear all messages
'
),
'
label_message_limit
'
:
__
(
'
Message characters remaining
'
),
'
label_toggle_spoiler
'
:
label_toggle_spoiler
,
'
message_limit
'
:
_converse
.
api
.
settings
.
get
(
'
message_limit
'
),
'
show_call_button
'
:
_converse
.
api
.
settings
.
get
(
'
visible_toolbar_buttons
'
).
call
,
'
show_spoiler_button
'
:
_converse
.
api
.
settings
.
get
(
'
visible_toolbar_buttons
'
).
spoiler
,
'
message_limit
'
:
api
.
settings
.
get
(
'
message_limit
'
),
'
show_call_button
'
:
api
.
settings
.
get
(
'
visible_toolbar_buttons
'
).
call
,
'
show_spoiler_button
'
:
api
.
settings
.
get
(
'
visible_toolbar_buttons
'
).
spoiler
,
'
tooltip_start_call
'
:
__
(
'
Start a call
'
)
}
},
...
...
@@ -476,7 +477,7 @@ converse.plugins.add('converse-chatview', {
* @type {_converse.ChatBoxView | _converse.ChatRoomView}
* @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
*/
_converse
.
api
.
trigger
(
'
afterMessagesFetched
'
,
this
);
api
.
trigger
(
'
afterMessagesFetched
'
,
this
);
},
insertIntoDOM
()
{
...
...
@@ -487,7 +488,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('chatBoxInsertedIntoDOM', view => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxInsertedIntoDOM
'
,
this
);
api
.
trigger
(
'
chatBoxInsertedIntoDOM
'
,
this
);
return
this
;
},
...
...
@@ -631,7 +632,7 @@ converse.plugins.add('converse-chatview', {
* @property { string } message - The message text
* @example _converse.api.listen.on('contactStatusMessageChanged', obj => { ... });
*/
_converse
.
api
.
trigger
(
'
contactStatusMessageChanged
'
,
{
api
.
trigger
(
'
contactStatusMessageChanged
'
,
{
'
contact
'
:
item
.
attributes
,
'
message
'
:
item
.
get
(
'
status
'
)
});
...
...
@@ -792,7 +793,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
* @example _converse.api.listen.on('messageAdded', data => { ... });
*/
_converse
.
api
.
trigger
(
'
messageAdded
'
,
{
api
.
trigger
(
'
messageAdded
'
,
{
'
message
'
:
message
,
'
chatbox
'
:
this
.
model
});
...
...
@@ -824,7 +825,7 @@ converse.plugins.add('converse-chatview', {
ev
.
preventDefault
();
const
textarea
=
this
.
el
.
querySelector
(
'
.chat-textarea
'
);
const
message_text
=
textarea
.
value
.
trim
();
if
(
_converse
.
api
.
settings
.
get
(
'
message_limit
'
)
&&
message_text
.
length
>
_converse
.
api
.
settings
.
get
(
'
message_limit
'
)
||
if
(
api
.
settings
.
get
(
'
message_limit
'
)
&&
message_text
.
length
>
api
.
settings
.
get
(
'
message_limit
'
)
||
!
message_text
.
replace
(
/
\s
/g
,
''
).
length
)
{
return
;
}
...
...
@@ -833,7 +834,7 @@ converse.plugins.add('converse-chatview', {
[
'
Sorry, the connection has been lost, and your message could not be sent
'
],
'
error
'
);
_converse
.
api
.
connection
.
reconnect
();
api
.
connection
.
reconnect
();
return
;
}
let
spoiler_hint
,
hint_el
=
{};
...
...
@@ -860,9 +861,9 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.Message }
* @example _converse.api.listen.on('messageSend', message => { ... });
*/
_converse
.
api
.
trigger
(
'
messageSend
'
,
message
);
api
.
trigger
(
'
messageSend
'
,
message
);
}
if
(
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
)
{
if
(
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
)
{
// XXX: Chrome flexbug workaround. The .chat-content area
// doesn't resize when the textarea is resized to its original size.
this
.
msgs_container
.
parentElement
.
style
.
display
=
'
none
'
;
...
...
@@ -870,7 +871,7 @@ converse.plugins.add('converse-chatview', {
textarea
.
removeAttribute
(
'
disabled
'
);
u
.
removeClass
(
'
disabled
'
,
textarea
);
if
(
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
)
{
if
(
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
)
{
// XXX: Chrome flexbug workaround.
this
.
msgs_container
.
parentElement
.
style
.
display
=
''
;
}
...
...
@@ -881,9 +882,9 @@ converse.plugins.add('converse-chatview', {
},
updateCharCounter
(
chars
)
{
if
(
_converse
.
api
.
settings
.
get
(
'
message_limit
'
))
{
if
(
api
.
settings
.
get
(
'
message_limit
'
))
{
const
message_limit
=
this
.
el
.
querySelector
(
'
.message-limit
'
);
const
counter
=
_converse
.
api
.
settings
.
get
(
'
message_limit
'
)
-
chars
.
length
;
const
counter
=
api
.
settings
.
get
(
'
message_limit
'
)
-
chars
.
length
;
message_limit
.
textContent
=
counter
;
if
(
counter
<
1
)
{
u
.
addClass
(
'
error
'
,
message_limit
);
...
...
@@ -992,10 +993,10 @@ converse.plugins.add('converse-chatview', {
"
be removed everywhere.
"
);
const
messages
=
[
__
(
'
Are you sure you want to retract this message?
'
)];
if
(
_converse
.
api
.
settings
.
get
(
'
show_retraction_warning
'
))
{
if
(
api
.
settings
.
get
(
'
show_retraction_warning
'
))
{
messages
[
1
]
=
retraction_warning
;
}
const
result
=
await
_converse
.
api
.
confirm
(
__
(
'
Confirm
'
),
messages
);
const
result
=
await
api
.
confirm
(
__
(
'
Confirm
'
),
messages
);
if
(
result
)
{
this
.
model
.
retractOwnMessage
(
message
);
}
...
...
@@ -1138,7 +1139,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } _converse.connection - The XMPP Connection object
* @example _converse.api.listen.on('callButtonClicked', (connection, model) => { ... });
*/
_converse
.
api
.
trigger
(
'
callButtonClicked
'
,
{
api
.
trigger
(
'
callButtonClicked
'
,
{
connection
:
_converse
.
connection
,
model
:
this
.
model
});
...
...
@@ -1207,7 +1208,7 @@ converse.plugins.add('converse-chatview', {
if
(
_converse
.
router
.
history
.
getFragment
()
===
"
converse/chat?jid=
"
+
this
.
model
.
get
(
'
jid
'
))
{
_converse
.
router
.
navigate
(
''
);
}
if
(
_converse
.
api
.
connection
.
connected
())
{
if
(
api
.
connection
.
connected
())
{
// Immediately sending the chat state, because the
// model is going to be destroyed afterwards.
this
.
model
.
setChatState
(
_converse
.
INACTIVE
);
...
...
@@ -1221,7 +1222,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxClosed', view => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxClosed
'
,
this
);
api
.
trigger
(
'
chatBoxClosed
'
,
this
);
return
this
;
},
...
...
@@ -1236,7 +1237,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxBlurred', (view, event) => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxBlurred
'
,
this
,
ev
);
api
.
trigger
(
'
chatBoxBlurred
'
,
this
,
ev
);
},
emitFocused
(
ev
)
{
...
...
@@ -1250,7 +1251,7 @@ converse.plugins.add('converse-chatview', {
* @type { _converse.ChatBoxView | _converse.ChatRoomView }
* @example _converse.api.listen.on('chatBoxFocused', (view, event) => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxFocused
'
,
this
,
ev
);
api
.
trigger
(
'
chatBoxFocused
'
,
this
,
ev
);
},
focus
()
{
...
...
@@ -1262,7 +1263,7 @@ converse.plugins.add('converse-chatview', {
},
maybeFocus
()
{
_converse
.
api
.
settings
.
get
(
'
auto_focus
'
)
&&
this
.
focus
();
api
.
settings
.
get
(
'
auto_focus
'
)
&&
this
.
focus
();
},
hide
()
{
...
...
@@ -1289,9 +1290,9 @@ converse.plugins.add('converse-chatview', {
* @type {object}
* @property { _converse.ChatBoxView | _converse.ChatRoomView } view
*/
_converse
.
api
.
trigger
(
'
beforeShowingChatView
'
,
this
);
api
.
trigger
(
'
beforeShowingChatView
'
,
this
);
if
(
_converse
.
api
.
settings
.
get
(
'
animate
'
))
{
if
(
api
.
settings
.
get
(
'
animate
'
))
{
u
.
fadeIn
(
this
.
el
,
()
=>
this
.
afterShown
());
}
else
{
u
.
showElement
(
this
.
el
);
...
...
@@ -1363,7 +1364,7 @@ converse.plugins.add('converse-chatview', {
* @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
* @example _converse.api.listen.on('chatBoxScrolledDown', obj => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxScrolledDown
'
,
{
'
chatbox
'
:
this
.
model
});
// TODO: clean up
api
.
trigger
(
'
chatBoxScrolledDown
'
,
{
'
chatbox
'
:
this
.
model
});
// TODO: clean up
},
onWindowStateChanged
(
state
)
{
...
...
@@ -1381,7 +1382,7 @@ converse.plugins.add('converse-chatview', {
}
});
_converse
.
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
const
views
=
_converse
.
chatboxviews
;
_converse
.
chatboxes
.
on
(
'
add
'
,
async
item
=>
{
if
(
!
views
.
get
(
item
.
get
(
'
id
'
))
&&
item
.
get
(
'
type
'
)
===
_converse
.
PRIVATE_CHAT_TYPE
)
{
...
...
@@ -1402,13 +1403,13 @@ converse.plugins.add('converse-chatview', {
});
}
}
_converse
.
api
.
listen
.
on
(
'
windowStateChanged
'
,
onWindowStateChanged
);
_converse
.
api
.
listen
.
on
(
'
connected
'
,
()
=>
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
SPOILER
));
api
.
listen
.
on
(
'
windowStateChanged
'
,
onWindowStateChanged
);
api
.
listen
.
on
(
'
connected
'
,
()
=>
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
SPOILER
));
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The "chatview" namespace groups methods pertaining to views
* for one-on-one chats.
...
...
src/converse-controlbox.js
View file @
030c26a8
...
...
@@ -98,10 +98,11 @@ converse.plugins.add('converse-controlbox', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
,
{
__
}
=
_converse
;
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
allow_logout
:
true
,
default_domain
:
undefined
,
locked_domain
:
undefined
,
...
...
@@ -109,7 +110,7 @@ converse.plugins.add('converse-controlbox', {
sticky_controlbox
:
false
});
_converse
.
api
.
promises
.
add
(
'
controlBoxInitialized
'
);
api
.
promises
.
add
(
'
controlBoxInitialized
'
);
_converse
.
ControlBox
=
_converse
.
ChatBox
.
extend
({
...
...
@@ -119,7 +120,7 @@ converse.plugins.add('converse-controlbox', {
'
bookmarked
'
:
false
,
'
box_id
'
:
'
controlbox
'
,
'
chat_state
'
:
undefined
,
'
closed
'
:
!
_converse
.
api
.
settings
.
get
(
'
show_controlbox_by_default
'
),
'
closed
'
:
!
api
.
settings
.
get
(
'
show_controlbox_by_default
'
),
'
num_unread
'
:
0
,
'
time_opened
'
:
this
.
get
(
'
time_opened
'
)
||
(
new
Date
()).
getTime
(),
'
type
'
:
_converse
.
CONTROLBOX_TYPE
,
...
...
@@ -137,7 +138,7 @@ converse.plugins.add('converse-controlbox', {
validate
(
attrs
)
{
if
(
attrs
.
type
===
_converse
.
CONTROLBOX_TYPE
)
{
if
(
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
embedded
'
&&
_converse
.
api
.
settings
.
get
(
"
singleton
"
))
{
if
(
api
.
settings
.
get
(
"
view_mode
"
)
===
'
embedded
'
&&
api
.
settings
.
get
(
"
singleton
"
))
{
return
'
Controlbox not relevant in embedded view mode
'
;
}
return
;
...
...
@@ -191,13 +192,13 @@ converse.plugins.add('converse-controlbox', {
* @type { _converse.ControlBoxView }
* @example _converse.api.listen.on('controlBoxInitialized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
controlBoxInitialized
'
,
this
);
api
.
trigger
(
'
controlBoxInitialized
'
,
this
);
},
render
()
{
if
(
this
.
model
.
get
(
'
connected
'
))
{
if
(
this
.
model
.
get
(
'
closed
'
)
===
undefined
)
{
this
.
model
.
set
(
'
closed
'
,
!
_converse
.
api
.
settings
.
get
(
'
show_controlbox_by_default
'
));
this
.
model
.
set
(
'
closed
'
,
!
api
.
settings
.
get
(
'
show_controlbox_by_default
'
));
}
}
this
.
el
.
innerHTML
=
tpl_controlbox
(
Object
.
assign
(
this
.
model
.
toJSON
()));
...
...
@@ -225,7 +226,7 @@ converse.plugins.add('converse-controlbox', {
createBrandHeadingHTML
()
{
return
tpl_brand_heading
({
'
sticky_controlbox
'
:
_converse
.
api
.
settings
.
get
(
'
sticky_controlbox
'
)
'
sticky_controlbox
'
:
api
.
settings
.
get
(
'
sticky_controlbox
'
)
});
},
...
...
@@ -285,10 +286,10 @@ converse.plugins.add('converse-controlbox', {
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
if
(
ev
?.
name
===
'
closeAllChatBoxes
'
&&
(
_converse
.
disconnection_cause
!==
_converse
.
LOGOUT
||
_converse
.
api
.
settings
.
get
(
'
show_controlbox_by_default
'
)))
{
api
.
settings
.
get
(
'
show_controlbox_by_default
'
)))
{
return
;
}
if
(
_converse
.
api
.
settings
.
get
(
'
sticky_controlbox
'
))
{
if
(
api
.
settings
.
get
(
'
sticky_controlbox
'
))
{
return
;
}
const
connection
=
_converse
?.
connection
||
{};
...
...
@@ -302,7 +303,7 @@ converse.plugins.add('converse-controlbox', {
}
else
{
this
.
model
.
trigger
(
'
hide
'
);
}
_converse
.
api
.
trigger
(
'
controlBoxClosed
'
,
this
);
api
.
trigger
(
'
controlBoxClosed
'
,
this
);
return
this
;
},
...
...
@@ -315,13 +316,13 @@ converse.plugins.add('converse-controlbox', {
},
hide
(
callback
)
{
if
(
_converse
.
api
.
settings
.
get
(
'
sticky_controlbox
'
))
{
if
(
api
.
settings
.
get
(
'
sticky_controlbox
'
))
{
return
;
}
u
.
addClass
(
'
hidden
'
,
this
.
el
);
_converse
.
api
.
trigger
(
'
chatBoxClosed
'
,
this
);
api
.
trigger
(
'
chatBoxClosed
'
,
this
);
if
(
!
_converse
.
api
.
connection
.
connected
())
{
if
(
!
api
.
connection
.
connected
())
{
_converse
.
controlboxtoggle
.
render
();
}
_converse
.
controlboxtoggle
.
show
(
callback
);
...
...
@@ -336,7 +337,7 @@ converse.plugins.add('converse-controlbox', {
* @event _converse#controlBoxOpened
* @type {_converse.ControlBox}
*/
_converse
.
api
.
trigger
(
'
controlBoxOpened
'
,
this
);
api
.
trigger
(
'
controlBoxOpened
'
,
this
);
},
show
()
{
...
...
@@ -387,12 +388,12 @@ converse.plugins.add('converse-controlbox', {
'
LOGIN
'
:
_converse
.
LOGIN
,
'
PREBIND
'
:
_converse
.
PREBIND
,
'
auto_login
'
:
_converse
.
auto_login
,
'
authentication
'
:
_converse
.
api
.
settings
.
get
(
"
authentication
"
),
'
authentication
'
:
api
.
settings
.
get
(
"
authentication
"
),
'
connection_status
'
:
connection_status
,
'
conn_feedback_class
'
:
feedback_class
,
'
conn_feedback_subject
'
:
pretty_status
,
'
conn_feedback_message
'
:
_converse
.
connfeedback
.
get
(
'
message
'
),
'
placeholder_username
'
:
(
_converse
.
api
.
settings
.
get
(
'
locked_domain
'
)
||
_converse
.
api
.
settings
.
get
(
'
default_domain
'
))
&&
'
placeholder_username
'
:
(
api
.
settings
.
get
(
'
locked_domain
'
)
||
api
.
settings
.
get
(
'
default_domain
'
))
&&
__
(
'
Username
'
)
||
__
(
'
user@domain
'
),
'
show_trust_checkbox
'
:
_converse
.
trusted
!==
'
on
'
&&
_converse
.
trusted
!==
'
off
'
})
...
...
@@ -402,8 +403,8 @@ converse.plugins.add('converse-controlbox', {
initPopovers
()
{
Array
.
from
(
this
.
el
.
querySelectorAll
(
'
[data-title]
'
)).
forEach
(
el
=>
{
new
bootstrap
.
Popover
(
el
,
{
'
trigger
'
:
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
mobile
'
&&
'
click
'
||
'
hover
'
,
'
dismissible
'
:
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
mobile
'
&&
true
||
false
,
'
trigger
'
:
api
.
settings
.
get
(
"
view_mode
"
)
===
'
mobile
'
&&
'
click
'
||
'
hover
'
,
'
dismissible
'
:
api
.
settings
.
get
(
"
view_mode
"
)
===
'
mobile
'
&&
true
||
false
,
'
container
'
:
this
.
el
.
parentElement
.
parentElement
.
parentElement
})
});
...
...
@@ -413,8 +414,8 @@ converse.plugins.add('converse-controlbox', {
const
form
=
this
.
el
.
querySelector
(
'
form
'
);
const
jid_element
=
form
.
querySelector
(
'
input[name=jid]
'
);
if
(
jid_element
.
value
&&
!
_converse
.
api
.
settings
.
get
(
'
locked_domain
'
)
&&
!
_converse
.
api
.
settings
.
get
(
'
default_domain
'
)
&&
!
api
.
settings
.
get
(
'
locked_domain
'
)
&&
!
api
.
settings
.
get
(
'
default_domain
'
)
&&
!
u
.
isValidJID
(
jid_element
.
value
))
{
jid_element
.
setCustomValidity
(
__
(
'
Please enter a valid XMPP address
'
));
return
false
;
...
...
@@ -427,7 +428,7 @@ converse.plugins.add('converse-controlbox', {
/* Authenticate the user based on a form submission event.
*/
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
if
(
_converse
.
api
.
settings
.
get
(
"
authentication
"
)
===
_converse
.
ANONYMOUS
)
{
if
(
api
.
settings
.
get
(
"
authentication
"
)
===
_converse
.
ANONYMOUS
)
{
return
this
.
connect
(
_converse
.
jid
,
null
);
}
if
(
!
this
.
validate
())
{
return
;
}
...
...
@@ -447,14 +448,14 @@ converse.plugins.add('converse-controlbox', {
}
let
jid
=
form_data
.
get
(
'
jid
'
);
if
(
_converse
.
api
.
settings
.
get
(
'
locked_domain
'
))
{
const
last_part
=
'
@
'
+
_converse
.
api
.
settings
.
get
(
'
locked_domain
'
);
if
(
api
.
settings
.
get
(
'
locked_domain
'
))
{
const
last_part
=
'
@
'
+
api
.
settings
.
get
(
'
locked_domain
'
);
if
(
jid
.
endsWith
(
last_part
))
{
jid
=
jid
.
substr
(
0
,
jid
.
length
-
last_part
.
length
);
}
jid
=
Strophe
.
escapeNode
(
jid
)
+
last_part
;
}
else
if
(
_converse
.
api
.
settings
.
get
(
'
default_domain
'
)
&&
!
jid
.
includes
(
'
@
'
))
{
jid
=
jid
+
'
@
'
+
_converse
.
api
.
settings
.
get
(
'
default_domain
'
);
}
else
if
(
api
.
settings
.
get
(
'
default_domain
'
)
&&
!
jid
.
includes
(
'
@
'
))
{
jid
=
jid
+
'
@
'
+
api
.
settings
.
get
(
'
default_domain
'
);
}
this
.
connect
(
jid
,
form_data
.
get
(
'
password
'
));
},
...
...
@@ -464,7 +465,7 @@ converse.plugins.add('converse-controlbox', {
_converse
.
router
.
navigate
(
''
,
{
'
replace
'
:
true
});
}
_converse
.
connection
&&
_converse
.
connection
.
reset
();
_converse
.
api
.
user
.
login
(
jid
,
password
);
api
.
user
.
login
(
jid
,
password
);
}
});
...
...
@@ -480,7 +481,7 @@ converse.plugins.add('converse-controlbox', {
* @type { _converse.ControlBoxPane }
* @example _converse.api.listen.on('controlBoxPaneInitialized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
controlBoxPaneInitialized
'
,
this
);
api
.
trigger
(
'
controlBoxPaneInitialized
'
,
this
);
}
});
...
...
@@ -498,7 +499,7 @@ converse.plugins.add('converse-controlbox', {
initialize
()
{
_converse
.
chatboxviews
.
insertRowColumn
(
this
.
render
().
el
);
_converse
.
api
.
waitUntil
(
'
initialized
'
)
api
.
waitUntil
(
'
initialized
'
)
.
then
(
this
.
render
.
bind
(
this
))
.
catch
(
e
=>
log
.
fatal
(
e
));
},
...
...
@@ -509,7 +510,7 @@ converse.plugins.add('converse-controlbox', {
// artifacts (i.e. on page load the toggle is shown only to then
// seconds later be hidden in favor of the controlbox).
this
.
el
.
innerHTML
=
tpl_controlbox_toggle
({
'
label_toggle
'
:
_converse
.
api
.
connection
.
connected
()
?
__
(
'
Chat Contacts
'
)
:
__
(
'
Toggle chat
'
)
'
label_toggle
'
:
api
.
connection
.
connected
()
?
__
(
'
Chat Contacts
'
)
:
__
(
'
Toggle chat
'
)
})
return
this
;
},
...
...
@@ -532,7 +533,7 @@ converse.plugins.add('converse-controlbox', {
if
(
!
controlbox
)
{
controlbox
=
addControlBox
();
}
if
(
_converse
.
api
.
connection
.
connected
())
{
if
(
api
.
connection
.
connected
())
{
controlbox
.
save
({
'
closed
'
:
false
});
}
else
{
controlbox
.
trigger
(
'
show
'
);
...
...
@@ -543,7 +544,7 @@ converse.plugins.add('converse-controlbox', {
e
.
preventDefault
();
if
(
u
.
isVisible
(
_converse
.
root
.
querySelector
(
"
#controlbox
"
)))
{
const
controlbox
=
_converse
.
chatboxes
.
get
(
'
controlbox
'
);
if
(
_converse
.
api
.
connection
.
connected
)
{
if
(
api
.
connection
.
connected
)
{
controlbox
.
save
({
closed
:
true
});
}
else
{
controlbox
.
trigger
(
'
hide
'
);
...
...
@@ -557,7 +558,7 @@ converse.plugins.add('converse-controlbox', {
/******************** Event Handlers ********************/
_converse
.
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
_converse
.
chatboxes
.
on
(
'
add
'
,
item
=>
{
if
(
item
.
get
(
'
type
'
)
===
_converse
.
CONTROLBOX_TYPE
)
{
const
views
=
_converse
.
chatboxviews
;
...
...
@@ -572,7 +573,7 @@ converse.plugins.add('converse-controlbox', {
});
});
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
const
chatboxviews
=
_converse
?.
chatboxviews
;
const
view
=
chatboxviews
&&
chatboxviews
.
get
(
'
controlbox
'
);
if
(
view
)
{
...
...
@@ -585,11 +586,11 @@ converse.plugins.add('converse-controlbox', {
});
_converse
.
api
.
waitUntil
(
'
chatBoxViewsInitialized
'
)
api
.
waitUntil
(
'
chatBoxViewsInitialized
'
)
.
then
(
addControlBox
)
.
catch
(
e
=>
log
.
fatal
(
e
));
_converse
.
api
.
listen
.
on
(
'
chatBoxesFetched
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxesFetched
'
,
()
=>
{
const
controlbox
=
_converse
.
chatboxes
.
get
(
'
controlbox
'
)
||
addControlBox
();
controlbox
.
save
({
'
connected
'
:
true
});
});
...
...
@@ -603,12 +604,12 @@ converse.plugins.add('converse-controlbox', {
view
.
model
.
set
({
'
connected
'
:
false
});
return
view
;
};
_converse
.
api
.
listen
.
on
(
'
disconnected
'
,
()
=>
disconnect
().
renderLoginPanel
());
_converse
.
api
.
listen
.
on
(
'
will-reconnect
'
,
disconnect
);
api
.
listen
.
on
(
'
disconnected
'
,
()
=>
disconnect
().
renderLoginPanel
());
api
.
listen
.
on
(
'
will-reconnect
'
,
disconnect
);
/************************ API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The "controlbox" namespace groups methods pertaining to the
* controlbox view
...
...
@@ -623,9 +624,9 @@ converse.plugins.add('converse-controlbox', {
* @returns { Promise<_converse.ControlBox> }
*/
async
open
()
{
await
_converse
.
api
.
waitUntil
(
'
chatBoxesFetched
'
);
const
model
=
await
_converse
.
api
.
chatboxes
.
get
(
'
controlbox
'
)
||
_converse
.
api
.
chatboxes
.
create
(
'
controlbox
'
,
{},
_converse
.
Controlbox
);
await
api
.
waitUntil
(
'
chatBoxesFetched
'
);
const
model
=
await
api
.
chatboxes
.
get
(
'
controlbox
'
)
||
api
.
chatboxes
.
create
(
'
controlbox
'
,
{},
_converse
.
Controlbox
);
model
.
trigger
(
'
show
'
);
return
model
;
},
...
...
src/converse-dragresize.js
View file @
030c26a8
...
...
@@ -134,8 +134,9 @@ converse.plugins.add('converse-dragresize', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
allow_dragresize
'
:
true
,
});
...
...
@@ -252,7 +253,7 @@ converse.plugins.add('converse-dragresize', {
},
onStartVerticalResize
(
ev
,
trigger
=
true
)
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
if
(
!
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
return
true
;
}
// Record element attributes for mouseMove().
...
...
@@ -270,12 +271,12 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startVerticalResize
* @example _converse.api.listen.on('startVerticalResize', (view) => { ... });
*/
_converse
.
api
.
trigger
(
'
startVerticalResize
'
,
this
);
api
.
trigger
(
'
startVerticalResize
'
,
this
);
}
},
onStartHorizontalResize
(
ev
,
trigger
=
true
)
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
if
(
!
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
return
true
;
}
const
flyout
=
this
.
el
.
querySelector
(
'
.box-flyout
'
),
...
...
@@ -292,7 +293,7 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startHorizontalResize
* @example _converse.api.listen.on('startHorizontalResize', (view) => { ... });
*/
_converse
.
api
.
trigger
(
'
startHorizontalResize
'
,
this
);
api
.
trigger
(
'
startHorizontalResize
'
,
this
);
}
},
...
...
@@ -306,7 +307,7 @@ converse.plugins.add('converse-dragresize', {
* @event _converse#startDiagonalResize
* @example _converse.api.listen.on('startDiagonalResize', (view) => { ... });
*/
_converse
.
api
.
trigger
(
'
startDiagonalResize
'
,
this
);
api
.
trigger
(
'
startDiagonalResize
'
,
this
);
},
};
Object
.
assign
(
_converse
.
ChatBoxView
.
prototype
,
dragResizable
);
...
...
@@ -332,7 +333,7 @@ converse.plugins.add('converse-dragresize', {
function
onMouseMove
(
ev
)
{
if
(
!
_converse
.
resizing
||
!
_converse
.
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
if
(
!
_converse
.
resizing
||
!
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
return
true
;
}
ev
.
preventDefault
();
...
...
@@ -341,7 +342,7 @@ converse.plugins.add('converse-dragresize', {
function
onMouseUp
(
ev
)
{
if
(
!
_converse
.
resizing
||
!
_converse
.
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
if
(
!
_converse
.
resizing
||
!
api
.
settings
.
get
(
'
allow_dragresize
'
))
{
return
true
;
}
ev
.
preventDefault
();
...
...
@@ -353,7 +354,7 @@ converse.plugins.add('converse-dragresize', {
_converse
.
resizing
.
chatbox
.
width
,
_converse
.
resizing
.
chatbox
.
model
.
get
(
'
default_width
'
)
);
if
(
_converse
.
api
.
connection
.
connected
())
{
if
(
api
.
connection
.
connected
())
{
_converse
.
resizing
.
chatbox
.
model
.
save
({
'
height
'
:
height
});
_converse
.
resizing
.
chatbox
.
model
.
save
({
'
width
'
:
width
});
}
else
{
...
...
@@ -374,9 +375,9 @@ converse.plugins.add('converse-dragresize', {
document
.
removeEventListener
(
'
mouseup
'
,
onMouseUp
);
}
_converse
.
api
.
listen
.
on
(
'
registeredGlobalEventHandlers
'
,
registerGlobalEventHandlers
);
_converse
.
api
.
listen
.
on
(
'
unregisteredGlobalEventHandlers
'
,
unregisterGlobalEventHandlers
);
_converse
.
api
.
listen
.
on
(
'
beforeShowingChatView
'
,
view
=>
view
.
initDragResize
().
setDimensions
());
api
.
listen
.
on
(
'
registeredGlobalEventHandlers
'
,
registerGlobalEventHandlers
);
api
.
listen
.
on
(
'
unregisteredGlobalEventHandlers
'
,
unregisterGlobalEventHandlers
);
api
.
listen
.
on
(
'
beforeShowingChatView
'
,
view
=>
view
.
initDragResize
().
setDimensions
());
/************************ END Event Handlers ************************/
}
});
src/converse-emoji-views.js
View file @
030c26a8
...
...
@@ -68,9 +68,10 @@ converse.plugins.add('converse-emoji-views', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
use_system_emojis
'
:
true
,
'
visible_toolbar_buttons
'
:
{
'
emoji
'
:
true
...
...
@@ -91,7 +92,7 @@ converse.plugins.add('converse-emoji-views', {
},
async
createEmojiPicker
()
{
await
_converse
.
api
.
emojis
.
initialize
()
await
api
.
emojis
.
initialize
()
const
id
=
`converse.emoji-
${
_converse
.
bare_jid
}
-
${
this
.
model
.
get
(
'
jid
'
)}
`
;
const
emojipicker
=
new
_converse
.
EmojiPicker
({
'
id
'
:
id
});
...
...
@@ -151,7 +152,7 @@ converse.plugins.add('converse-emoji-views', {
Object
.
assign
(
this
.
model
.
toJSON
(),
{
'
_converse
'
:
_converse
,
'
emoji_categories
'
:
_converse
.
api
.
settings
.
get
(
'
emoji_categories
'
),
'
emoji_categories
'
:
api
.
settings
.
get
(
'
emoji_categories
'
),
'
emojis_by_category
'
:
_converse
.
emojis
.
json
,
'
onSkintonePicked
'
:
ev
=>
this
.
chooseSkinTone
(
ev
),
'
onEmojiPicked
'
:
ev
=>
this
.
insertEmoji
(
ev
),
...
...
@@ -415,18 +416,18 @@ converse.plugins.add('converse-emoji-views', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
chatBoxClosed
'
,
view
=>
view
.
emoji_picker_view
&&
view
.
emoji_picker_view
.
remove
());
api
.
listen
.
on
(
'
chatBoxClosed
'
,
view
=>
view
.
emoji_picker_view
&&
view
.
emoji_picker_view
.
remove
());
_converse
.
api
.
listen
.
on
(
'
renderToolbar
'
,
view
=>
{
if
(
_converse
.
api
.
settings
.
get
(
'
visible_toolbar_buttons
'
).
emoji
)
{
api
.
listen
.
on
(
'
renderToolbar
'
,
view
=>
{
if
(
api
.
settings
.
get
(
'
visible_toolbar_buttons
'
).
emoji
)
{
const
html
=
tpl_emoji_button
({
'
tooltip_insert_smiley
'
:
__
(
'
Insert emojis
'
)});
view
.
el
.
querySelector
(
'
.chat-toolbar
'
).
insertAdjacentHTML
(
'
afterBegin
'
,
html
);
}
});
_converse
.
api
.
listen
.
on
(
'
headlinesBoxInitialized
'
,
()
=>
_converse
.
api
.
emojis
.
initialize
());
_converse
.
api
.
listen
.
on
(
'
chatRoomInitialized
'
,
()
=>
_converse
.
api
.
emojis
.
initialize
());
_converse
.
api
.
listen
.
on
(
'
chatBoxInitialized
'
,
()
=>
_converse
.
api
.
emojis
.
initialize
());
api
.
listen
.
on
(
'
headlinesBoxInitialized
'
,
()
=>
api
.
emojis
.
initialize
());
api
.
listen
.
on
(
'
chatRoomInitialized
'
,
()
=>
api
.
emojis
.
initialize
());
api
.
listen
.
on
(
'
chatBoxInitialized
'
,
()
=>
api
.
emojis
.
initialize
());
/************************ END Event Handlers ************************/
}
...
...
src/converse-headlines-view.js
View file @
030c26a8
...
...
@@ -48,6 +48,7 @@ converse.plugins.add('converse-headlines-view', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
viewWithHeadlinesPanel
=
{
...
...
@@ -62,7 +63,7 @@ converse.plugins.add('converse-headlines-view', {
* @event _converse#headlinesPanelRendered
* @example _converse.api.listen.on('headlinesPanelRendered', () => { ... });
*/
_converse
.
api
.
trigger
(
'
headlinesPanelRendered
'
);
api
.
trigger
(
'
headlinesPanelRendered
'
);
return
this
.
headlinepanel
;
}
}
...
...
@@ -150,7 +151,7 @@ converse.plugins.add('converse-headlines-view', {
* @type { _converse.HeadlinesBoxView }
* @example _converse.api.listen.on('headlinesBoxViewInitialized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
headlinesBoxViewInitialized
'
,
this
);
api
.
trigger
(
'
headlinesBoxViewInitialized
'
,
this
);
},
render
()
{
...
...
@@ -177,7 +178,7 @@ converse.plugins.add('converse-headlines-view', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
const
views
=
_converse
.
chatboxviews
;
_converse
.
chatboxes
.
on
(
'
add
'
,
item
=>
{
if
(
!
views
.
get
(
item
.
get
(
'
id
'
))
&&
item
.
get
(
'
type
'
)
===
_converse
.
HEADLINES_TYPE
)
{
...
...
src/converse-message-view.js
View file @
030c26a8
...
...
@@ -32,6 +32,7 @@ converse.plugins.add('converse-message-view', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
...
...
@@ -65,7 +66,7 @@ converse.plugins.add('converse-message-view', {
}
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
show_images_inline
'
:
true
,
'
time_format
'
:
'
HH:mm
'
,
});
...
...
@@ -153,7 +154,7 @@ converse.plugins.add('converse-message-view', {
},
fadeOut
()
{
if
(
_converse
.
api
.
settings
.
get
(
'
animate
'
))
{
if
(
api
.
settings
.
get
(
'
animate
'
))
{
setTimeout
(()
=>
this
.
remove
(),
600
);
u
.
addClass
(
'
fade-out
'
,
this
.
el
);
}
else
{
...
...
@@ -204,10 +205,10 @@ converse.plugins.add('converse-message-view', {
* @param { string } text - The message text
* @example _converse.api.listen.on('beforeMessageBodyTransformed', (view, text) => { ... });
*/
await
_converse
.
api
.
trigger
(
'
beforeMessageBodyTransformed
'
,
this
,
text
,
{
'
Synchronous
'
:
true
});
await
api
.
trigger
(
'
beforeMessageBodyTransformed
'
,
this
,
text
,
{
'
Synchronous
'
:
true
});
text
=
this
.
model
.
isMeCommand
()
?
text
.
substring
(
4
)
:
text
;
text
=
xss
.
filterXSS
(
text
,
{
'
whiteList
'
:
{},
'
onTag
'
:
onTagFoundDuringXSSFilter
});
text
=
u
.
geoUriToHttp
(
text
,
_converse
.
api
.
settings
.
get
(
"
geouri_replacement
"
));
text
=
u
.
geoUriToHttp
(
text
,
api
.
settings
.
get
(
"
geouri_replacement
"
));
text
=
u
.
addMentionsMarkup
(
text
,
this
.
model
.
get
(
'
references
'
),
this
.
model
.
collection
.
chatbox
);
text
=
u
.
addHyperlinks
(
text
);
text
=
u
.
renderNewLines
(
text
);
...
...
@@ -220,12 +221,12 @@ converse.plugins.add('converse-message-view', {
* @param { string } text - The message text
* @example _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => { ... });
*/
await
_converse
.
api
.
trigger
(
'
afterMessageBodyTransformed
'
,
this
,
text
,
{
'
Synchronous
'
:
true
});
await
api
.
trigger
(
'
afterMessageBodyTransformed
'
,
this
,
text
,
{
'
Synchronous
'
:
true
});
return
text
;
},
async
renderChatMessage
()
{
await
_converse
.
api
.
waitUntil
(
'
emojisInitialized
'
);
await
api
.
waitUntil
(
'
emojisInitialized
'
);
const
time
=
dayjs
(
this
.
model
.
get
(
'
time
'
));
const
role
=
this
.
model
.
vcard
?
this
.
model
.
vcard
.
get
(
'
role
'
)
:
null
;
const
roles
=
role
?
role
.
split
(
'
,
'
)
:
[];
...
...
@@ -243,7 +244,7 @@ converse.plugins.add('converse-message-view', {
'
is_me_message
'
:
this
.
model
.
isMeCommand
(),
'
label_show
'
:
__
(
'
Show more
'
),
'
occupant
'
:
this
.
model
.
occupant
,
'
pretty_time
'
:
time
.
format
(
_converse
.
api
.
settings
.
get
(
'
time_format
'
)),
'
pretty_time
'
:
time
.
format
(
api
.
settings
.
get
(
'
time_format
'
)),
'
retraction_text
'
:
is_retracted
?
this
.
getRetractionText
()
:
null
,
'
roles
'
:
roles
,
'
time
'
:
time
.
toISOString
(),
...
...
@@ -259,7 +260,7 @@ converse.plugins.add('converse-message-view', {
const
msg_content
=
msg
.
querySelector
(
'
.chat-msg__text
'
);
if
(
text
&&
text
!==
url
)
{
msg_content
.
innerHTML
=
await
this
.
transformBodyText
(
text
);
if
(
_converse
.
api
.
settings
.
get
(
'
show_images_inline
'
))
{
if
(
api
.
settings
.
get
(
'
show_images_inline
'
))
{
u
.
renderImageURLs
(
_converse
,
msg_content
).
then
(()
=>
this
.
triggerRendered
());
}
}
...
...
src/converse-minimize.js
View file @
030c26a8
...
...
@@ -165,8 +165,9 @@ converse.plugins.add('converse-minimize', {
*/
const
{
_converse
}
=
this
;
const
{
__
}
=
_converse
;
const
{
api
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
'
no_trimming
'
:
false
});
api
.
settings
.
update
({
'
no_trimming
'
:
false
});
const
minimizableChatBox
=
{
maximize
()
{
...
...
@@ -210,7 +211,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxMaximized
'
,
this
);
api
.
trigger
(
'
chatBoxMaximized
'
,
this
);
return
this
;
},
...
...
@@ -239,7 +240,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.ChatBoxView }
* @example _converse.api.listen.on('chatBoxMinimized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxMinimized
'
,
this
);
api
.
trigger
(
'
chatBoxMinimized
'
,
this
);
return
this
;
},
...
...
@@ -314,7 +315,7 @@ converse.plugins.add('converse-minimize', {
* @param { _converse.ChatBoxView|_converse.ChatRoomView|_converse.ControlBoxView|_converse.HeadlinesBoxView } [newchat]
*/
async
trimChats
(
newchat
)
{
if
(
_converse
.
api
.
settings
.
get
(
'
no_trimming
'
)
||
!
_converse
.
api
.
connection
.
connected
()
||
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
!==
'
overlayed
'
)
{
if
(
api
.
settings
.
get
(
'
no_trimming
'
)
||
!
api
.
connection
.
connected
()
||
api
.
settings
.
get
(
"
view_mode
"
)
!==
'
overlayed
'
)
{
return
;
}
const
shown_chats
=
this
.
getShownChats
();
...
...
@@ -328,7 +329,7 @@ converse.plugins.add('converse-minimize', {
// fullscreen. In this case we don't trim.
return
;
}
await
_converse
.
api
.
waitUntil
(
'
minimizedChatsInitialized
'
);
await
api
.
waitUntil
(
'
minimizedChatsInitialized
'
);
const
minimized_el
=
_converse
.
minimized_chats
?.
el
;
if
(
minimized_el
)
{
while
((
this
.
getMinimizedWidth
()
+
this
.
getBoxesWidth
(
newchat
))
>
body_width
)
{
...
...
@@ -369,7 +370,7 @@ converse.plugins.add('converse-minimize', {
Object
.
assign
(
_converse
.
ChatBoxViews
.
prototype
,
chatTrimmer
);
_converse
.
api
.
promises
.
add
(
'
minimizedChatsInitialized
'
);
api
.
promises
.
add
(
'
minimizedChatsInitialized
'
);
_converse
.
MinimizedChatBoxView
=
View
.
extend
({
tagName
:
'
div
'
,
...
...
@@ -390,7 +391,7 @@ converse.plugins.add('converse-minimize', {
* @type { _converse.MinimizedChatBoxView }
* @example _converse.api.listen.on('minimizedChatViewInitialized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
minimizedChatViewInitialized
'
,
this
);
api
.
trigger
(
'
minimizedChatViewInitialized
'
,
this
);
},
render
()
{
...
...
@@ -413,7 +414,7 @@ converse.plugins.add('converse-minimize', {
view
.
close
();
}
else
{
this
.
model
.
destroy
();
_converse
.
api
.
trigger
(
'
chatBoxClosed
'
,
this
);
api
.
trigger
(
'
chatBoxClosed
'
,
this
);
}
return
this
;
},
...
...
@@ -562,17 +563,17 @@ converse.plugins.add('converse-minimize', {
* @event _converse#minimizedChatsInitialized
* @example _converse.api.listen.on('minimizedChatsInitialized', () => { ... });
*/
_converse
.
api
.
trigger
(
'
minimizedChatsInitialized
'
);
api
.
trigger
(
'
minimizedChatsInitialized
'
);
}
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
initMinimizedChats
());
_converse
.
api
.
listen
.
on
(
'
chatBoxInsertedIntoDOM
'
,
view
=>
_converse
.
chatboxviews
.
trimChats
(
view
));
_converse
.
api
.
listen
.
on
(
'
controlBoxOpened
'
,
view
=>
_converse
.
chatboxviews
.
trimChats
(
view
));
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
initMinimizedChats
());
api
.
listen
.
on
(
'
chatBoxInsertedIntoDOM
'
,
view
=>
_converse
.
chatboxviews
.
trimChats
(
view
));
api
.
listen
.
on
(
'
controlBoxOpened
'
,
view
=>
_converse
.
chatboxviews
.
trimChats
(
view
));
const
debouncedTrimChats
=
debounce
(()
=>
_converse
.
chatboxviews
.
trimChats
(),
250
);
_converse
.
api
.
listen
.
on
(
'
registeredGlobalEventHandlers
'
,
()
=>
window
.
addEventListener
(
"
resize
"
,
debouncedTrimChats
));
_converse
.
api
.
listen
.
on
(
'
unregisteredGlobalEventHandlers
'
,
()
=>
window
.
removeEventListener
(
"
resize
"
,
debouncedTrimChats
));
api
.
listen
.
on
(
'
registeredGlobalEventHandlers
'
,
()
=>
window
.
addEventListener
(
"
resize
"
,
debouncedTrimChats
));
api
.
listen
.
on
(
'
unregisteredGlobalEventHandlers
'
,
()
=>
window
.
removeEventListener
(
"
resize
"
,
debouncedTrimChats
));
/************************ END Event Handlers ************************/
}
});
src/converse-muc-views.js
View file @
030c26a8
...
...
@@ -90,14 +90,15 @@ converse.plugins.add('converse-muc-views', {
initialize
()
{
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
promises
.
add
([
'
roomsPanelRendered
'
]);
api
.
promises
.
add
([
'
roomsPanelRendered
'
]);
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
auto_list_rooms
'
:
false
,
'
cache_muc_messages
'
:
true
,
'
locked_muc_nickname
'
:
false
,
...
...
@@ -142,7 +143,7 @@ converse.plugins.add('converse-muc-views', {
* @event _converse#roomsPanelRendered
* @example _converse.api.listen.on('roomsPanelRendered', () => { ... });
*/
_converse
.
api
.
trigger
(
'
roomsPanelRendered
'
);
api
.
trigger
(
'
roomsPanelRendered
'
);
return
this
.
roomspanel
;
},
...
...
@@ -216,7 +217,7 @@ converse.plugins.add('converse-muc-views', {
parent_el
.
querySelector
(
'
a.room-info
'
).
classList
.
remove
(
'
selected
'
);
}
else
{
parent_el
.
insertAdjacentHTML
(
'
beforeend
'
,
tpl_spinner
());
_converse
.
api
.
disco
.
info
(
ev
.
target
.
getAttribute
(
'
data-room-jid
'
),
null
)
api
.
disco
.
info
(
ev
.
target
.
getAttribute
(
'
data-room-jid
'
),
null
)
.
then
(
stanza
=>
insertRoomInfo
(
parent_el
,
stanza
))
.
catch
(
e
=>
log
.
error
(
e
));
}
...
...
@@ -449,7 +450,7 @@ converse.plugins.add('converse-muc-views', {
const
jid
=
ev
.
target
.
getAttribute
(
'
data-room-jid
'
);
const
name
=
ev
.
target
.
getAttribute
(
'
data-room-name
'
);
this
.
modal
.
hide
();
_converse
.
api
.
rooms
.
open
(
jid
,
{
'
name
'
:
name
});
api
.
rooms
.
open
(
jid
,
{
'
name
'
:
name
});
},
toggleRoomInfo
(
ev
)
{
...
...
@@ -516,7 +517,7 @@ converse.plugins.add('converse-muc-views', {
'
from
'
:
_converse
.
connection
.
jid
,
'
type
'
:
"
get
"
}).
c
(
"
query
"
,
{
xmlns
:
Strophe
.
NS
.
DISCO_ITEMS
});
_converse
.
api
.
sendIQ
(
iq
)
api
.
sendIQ
(
iq
)
.
then
(
iq
=>
this
.
onRoomsFound
(
iq
))
.
catch
(()
=>
this
.
informNoRoomsFound
())
},
...
...
@@ -606,7 +607,7 @@ converse.plugins.add('converse-muc-views', {
jid
=
data
.
jid
this
.
model
.
setDomain
(
jid
);
}
_converse
.
api
.
rooms
.
open
(
jid
,
Object
.
assign
(
data
,
{
jid
}));
api
.
rooms
.
open
(
jid
,
Object
.
assign
(
data
,
{
jid
}));
this
.
modal
.
hide
();
ev
.
target
.
reset
();
},
...
...
@@ -735,7 +736,7 @@ converse.plugins.add('converse-muc-views', {
* @type { _converse.ChatRoomView }
* @example _converse.api.listen.on('chatRoomViewInitialized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
chatRoomViewInitialized
'
,
this
);
api
.
trigger
(
'
chatRoomViewInitialized
'
,
this
);
},
render
()
{
...
...
@@ -990,7 +991,7 @@ converse.plugins.add('converse-muc-views', {
if
(
_converse
.
show_retraction_warning
)
{
messages
[
1
]
=
retraction_warning
;
}
const
result
=
await
_converse
.
api
.
confirm
(
__
(
'
Confirm
'
),
messages
);
const
result
=
await
api
.
confirm
(
__
(
'
Confirm
'
),
messages
);
if
(
result
)
{
this
.
retractOwnMessage
(
message
);
}
...
...
@@ -1000,7 +1001,7 @@ converse.plugins.add('converse-muc-views', {
if
(
_converse
.
show_retraction_warning
)
{
messages
=
[
messages
[
0
],
retraction_warning
,
messages
[
1
]]
}
if
(
await
_converse
.
api
.
confirm
(
__
(
'
Confirm
'
),
messages
))
{
if
(
await
api
.
confirm
(
__
(
'
Confirm
'
),
messages
))
{
this
.
retractOtherMessage
(
message
);
}
}
else
{
...
...
@@ -1011,7 +1012,7 @@ converse.plugins.add('converse-muc-views', {
if
(
_converse
.
show_retraction_warning
)
{
messages
=
[
messages
[
0
],
retraction_warning
,
messages
[
1
]]
}
const
reason
=
await
_converse
.
api
.
prompt
(
const
reason
=
await
api
.
prompt
(
__
(
'
Message Retraction
'
),
messages
,
__
(
'
Optional reason
'
)
...
...
@@ -1022,7 +1023,7 @@ converse.plugins.add('converse-muc-views', {
}
}
else
{
const
err_msg
=
__
(
`Sorry, you're not allowed to retract this message`
);
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msg
);
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msg
);
}
},
...
...
@@ -1057,13 +1058,13 @@ converse.plugins.add('converse-muc-views', {
const
result
=
await
this
.
model
.
retractOtherMessage
(
message
,
reason
);
if
(
result
===
null
)
{
const
err_msg
=
__
(
`A timeout occurred while trying to retract the message`
);
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msg
);
_converse
.
log
(
err_msg
,
Strophe
.
LogLevel
.
WARN
);
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msg
);
log
(
err_msg
,
Strophe
.
LogLevel
.
WARN
);
}
else
if
(
u
.
isErrorStanza
(
result
))
{
const
err_msg
=
__
(
`Sorry, you're not allowed to retract this message.`
);
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msg
);
_converse
.
log
(
err_msg
,
Strophe
.
LogLevel
.
WARN
);
_converse
.
log
(
result
,
Strophe
.
LogLevel
.
WARN
);
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msg
);
log
(
err_msg
,
Strophe
.
LogLevel
.
WARN
);
log
(
result
,
Strophe
.
LogLevel
.
WARN
);
}
},
...
...
@@ -1225,17 +1226,17 @@ converse.plugins.add('converse-muc-views', {
});
}
if
(
!
_converse
.
api
.
settings
.
get
(
"
singleton
"
))
{
if
(
!
api
.
settings
.
get
(
"
singleton
"
))
{
buttons
.
push
({
'
i18n_text
'
:
__
(
'
Leave
'
),
'
i18n_title
'
:
__
(
'
Leave and close this groupchat
'
),
'
handler
'
:
async
ev
=>
{
const
messages
=
[
__
(
'
Are you sure you want to leave this groupchat?
'
)];
const
result
=
await
_converse
.
api
.
confirm
(
__
(
'
Confirm
'
),
messages
);
const
result
=
await
api
.
confirm
(
__
(
'
Confirm
'
),
messages
);
result
&&
this
.
close
(
ev
);
},
'
a_class
'
:
'
close-chatbox-button
'
,
'
standalone
'
:
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
,
'
standalone
'
:
api
.
settings
.
get
(
"
view_mode
"
)
===
'
overlayed
'
,
'
icon_class
'
:
'
fa-sign-out-alt
'
,
'
name
'
:
'
signout
'
});
...
...
@@ -1547,7 +1548,7 @@ converse.plugins.add('converse-muc-views', {
async
destroy
(
reason
,
new_jid
)
{
const
message
=
[
__
(
'
Are you sure you want to destroy this groupchat?
'
)];
if
(
await
_converse
.
api
.
confirm
(
__
(
'
Confirm
'
),
message
))
{
if
(
await
api
.
confirm
(
__
(
'
Confirm
'
),
message
))
{
return
this
.
model
.
sendDestroyIQ
(
reason
,
new_jid
).
then
(()
=>
this
.
close
())
}
},
...
...
@@ -1646,7 +1647,7 @@ converse.plugins.add('converse-muc-views', {
this
.
showErrorMessage
(
__
(
'
Your nickname is "%1$s"
'
,
this
.
model
.
get
(
'
nick
'
)))
}
else
{
const
jid
=
Strophe
.
getBareJidFromJid
(
this
.
model
.
get
(
'
jid
'
));
_converse
.
api
.
send
(
$pres
({
api
.
send
(
$pres
({
from
:
_converse
.
connection
.
jid
,
to
:
`
${
jid
}
/
${
args
}
`
,
id
:
u
.
getUniqueId
()
...
...
@@ -1825,7 +1826,7 @@ converse.plugins.add('converse-muc-views', {
if
(
switch_el
)
{
switch_el
.
addEventListener
(
'
click
'
,
async
ev
=>
{
ev
.
preventDefault
();
const
room
=
await
_converse
.
api
.
rooms
.
get
(
moved_jid
,
null
,
true
);
const
room
=
await
api
.
rooms
.
get
(
moved_jid
,
null
,
true
);
room
.
maybeShow
(
true
);
this
.
model
.
destroy
();
});
...
...
@@ -2359,8 +2360,8 @@ converse.plugins.add('converse-muc-views', {
});
}
}
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
).
then
(()
=>
{
_converse
.
api
.
listen
.
on
(
'
serviceDiscovered
'
,
featureAdded
);
api
.
waitUntil
(
'
discoInitialized
'
).
then
(()
=>
{
api
.
listen
.
on
(
'
serviceDiscovered
'
,
featureAdded
);
// Features could have been added before the controlbox was
// initialized. We're only interested in MUC
_converse
.
disco_entities
.
each
(
entity
=>
featureAdded
(
entity
.
features
.
findWhere
({
'
var
'
:
Strophe
.
NS
.
MUC
})));
...
...
@@ -2381,11 +2382,11 @@ converse.plugins.add('converse-muc-views', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxViewsInitialized
'
,
()
=>
{
function
openChatRoomFromURIClicked
(
ev
)
{
ev
.
preventDefault
();
_converse
.
api
.
rooms
.
open
(
ev
.
target
.
href
);
api
.
rooms
.
open
(
ev
.
target
.
href
);
}
_converse
.
chatboxviews
.
delegate
(
'
click
'
,
'
a.open-chatroom
'
,
openChatRoomFromURIClicked
);
...
...
@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc-views', {
_converse
.
chatboxes
.
on
(
'
add
'
,
addView
);
});
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
const
view
=
_converse
.
chatboxviews
.
get
(
'
controlbox
'
);
if
(
view
&&
view
.
roomspanel
)
{
view
.
roomspanel
.
model
.
destroy
();
...
...
@@ -2411,7 +2412,7 @@ converse.plugins.add('converse-muc-views', {
}
});
_converse
.
api
.
listen
.
on
(
'
controlBoxInitialized
'
,
(
view
)
=>
{
api
.
listen
.
on
(
'
controlBoxInitialized
'
,
(
view
)
=>
{
if
(
!
_converse
.
allow_muc
)
{
return
;
}
...
...
@@ -2454,10 +2455,10 @@ converse.plugins.add('converse-muc-views', {
*/
get
(
jids
)
{
if
(
Array
.
isArray
(
jids
))
{
const
views
=
_converse
.
api
.
chatviews
.
get
(
jids
);
const
views
=
api
.
chatviews
.
get
(
jids
);
return
views
.
filter
(
v
=>
v
.
model
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
)
}
else
{
const
view
=
_converse
.
api
.
chatviews
.
get
(
jids
);
const
view
=
api
.
chatviews
.
get
(
jids
);
if
(
view
.
model
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
)
{
return
view
;
}
else
{
...
...
src/converse-notification.js
View file @
030c26a8
...
...
@@ -20,17 +20,18 @@ converse.plugins.add('converse-notification', {
*/
const
{
_converse
}
=
this
;
const
{
__
}
=
_converse
;
const
{
api
}
=
_converse
;
_converse
.
supports_html5_notification
=
"
Notification
"
in
window
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
notify_all_room_messages
:
false
,
show_desktop_notifications
:
true
,
show_chat_state_notifications
:
false
,
chatstate_notification_blacklist
:
[],
// ^ a list of JIDs to ignore concerning chat state notifications
play_sounds
:
true
,
sounds_path
:
_converse
.
api
.
settings
.
get
(
"
assets_path
"
)
+
'
/sounds/
'
,
sounds_path
:
api
.
settings
.
get
(
"
assets_path
"
)
+
'
/sounds/
'
,
notification_icon
:
'
logo/conversejs-filled.svg
'
,
notification_delay
:
5000
});
...
...
@@ -135,7 +136,7 @@ converse.plugins.add('converse-notification', {
const
full_from_jid
=
message
.
getAttribute
(
'
from
'
),
from_jid
=
Strophe
.
getBareJidFromJid
(
full_from_jid
);
if
(
message
.
getAttribute
(
'
type
'
)
===
'
headline
'
)
{
if
(
!
from_jid
.
includes
(
'
@
'
)
||
_converse
.
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
if
(
!
from_jid
.
includes
(
'
@
'
)
||
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
title
=
__
(
"
Notification from %1$s
"
,
from_jid
);
}
else
{
return
;
...
...
@@ -154,7 +155,7 @@ converse.plugins.add('converse-notification', {
if
(
roster_item
!==
undefined
)
{
title
=
__
(
"
%1$s says
"
,
roster_item
.
getDisplayName
());
}
else
{
if
(
_converse
.
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
if
(
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
title
=
__
(
"
%1$s says
"
,
from_jid
);
}
else
{
return
;
...
...
@@ -262,7 +263,7 @@ converse.plugins.add('converse-notification', {
* @type { XMLElement }
* @example _converse.api.listen.on('messageNotification', stanza => { ... });
*/
_converse
.
api
.
trigger
(
'
messageNotification
'
,
message
);
api
.
trigger
(
'
messageNotification
'
,
message
);
_converse
.
playSoundNotification
();
_converse
.
showMessageNotification
(
message
);
};
...
...
@@ -286,15 +287,15 @@ converse.plugins.add('converse-notification', {
}
};
_converse
.
api
.
listen
.
on
(
'
pluginsInitialized
'
,
function
()
{
api
.
listen
.
on
(
'
pluginsInitialized
'
,
function
()
{
// We only register event handlers after all plugins are
// registered, because other plugins might override some of our
// handlers.
_converse
.
api
.
listen
.
on
(
'
contactRequest
'
,
_converse
.
handleContactRequestNotification
);
_converse
.
api
.
listen
.
on
(
'
contactPresenceChanged
'
,
_converse
.
handleChatStateNotification
);
_converse
.
api
.
listen
.
on
(
'
message
'
,
_converse
.
handleMessageNotification
);
_converse
.
api
.
listen
.
on
(
'
feedback
'
,
_converse
.
handleFeedback
);
_converse
.
api
.
listen
.
on
(
'
connected
'
,
_converse
.
requestPermission
);
api
.
listen
.
on
(
'
contactRequest
'
,
_converse
.
handleContactRequestNotification
);
api
.
listen
.
on
(
'
contactPresenceChanged
'
,
_converse
.
handleChatStateNotification
);
api
.
listen
.
on
(
'
message
'
,
_converse
.
handleMessageNotification
);
api
.
listen
.
on
(
'
feedback
'
,
_converse
.
handleFeedback
);
api
.
listen
.
on
(
'
connected
'
,
_converse
.
requestPermission
);
});
}
});
src/converse-oauth.js
View file @
030c26a8
...
...
@@ -55,8 +55,9 @@ converse.plugins.add("converse-oauth", {
render
()
{
const
{
_converse
}
=
this
.
__super__
;
const
{
api
}
=
_converse
;
const
result
=
this
.
__super__
.
render
.
apply
(
this
,
arguments
);
if
(
_converse
.
oauth_providers
&&
!
_converse
.
api
.
settings
.
get
(
"
auto_login
"
))
{
if
(
_converse
.
oauth_providers
&&
!
api
.
settings
.
get
(
"
auto_login
"
))
{
this
.
insertOAuthProviders
();
}
return
result
;
...
...
@@ -68,10 +69,11 @@ converse.plugins.add("converse-oauth", {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
,
{
__
}
=
_converse
;
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
oauth_providers
'
:
{},
});
...
...
@@ -79,7 +81,7 @@ converse.plugins.add("converse-oauth", {
'
sync
'
:
function
sync
()
{},
initialize
()
{
_converse
.
api
.
settings
.
get
(
'
oauth_providers
'
).
forEach
(
provider
=>
{
api
.
settings
.
get
(
'
oauth_providers
'
).
forEach
(
provider
=>
{
const
item
=
new
Model
(
Object
.
assign
(
provider
,
{
'
login_text
'
:
__
(
'
Log in with %1$s
'
,
provider
.
name
)
}));
...
...
@@ -102,7 +104,7 @@ converse.plugins.add("converse-oauth", {
async
fetchOAuthProfileDataAndLogin
()
{
const
profile
=
await
this
.
oauth_service
.
api
(
'
me
'
);
const
response
=
this
.
oauth_service
.
getAuthResponse
();
_converse
.
api
.
user
.
login
(
api
.
user
.
login
(
`
${
profile
.
name
}
@
${
this
.
provider
.
get
(
'
host
'
)}
`
,
response
.
access_token
);
...
...
src/converse-omemo.js
View file @
030c26a8
...
...
@@ -242,12 +242,13 @@ converse.plugins.add('converse-omemo', {
*/
const
{
_converse
}
=
this
;
const
{
__
}
=
_converse
;
const
{
api
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
omemo_default
'
:
false
,
});
_converse
.
api
.
promises
.
add
([
'
OMEMOInitialized
'
]);
api
.
promises
.
add
([
'
OMEMOInitialized
'
]);
_converse
.
NUM_PREKEYS
=
100
;
// Set here so that tests can override
...
...
@@ -306,7 +307,7 @@ converse.plugins.add('converse-omemo', {
},
reportDecryptionError
(
e
)
{
if
(
_converse
.
api
.
settings
.
get
(
"
loglevel
"
)
===
'
debug
'
)
{
if
(
api
.
settings
.
get
(
"
loglevel
"
)
===
'
debug
'
)
{
const
{
__
}
=
_converse
;
this
.
createMessage
({
'
message
'
:
__
(
"
Sorry, could not decrypt a received OMEMO message due to an error.
"
)
+
`
${
e
.
name
}
${
e
.
message
}
`
,
...
...
@@ -414,10 +415,10 @@ converse.plugins.add('converse-omemo', {
err_msgs
.
push
(
__
(
"
Unable to send an encrypted message due to an unexpected error.
"
));
err_msgs
.
push
(
e
.
iq
.
outerHTML
);
}
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msgs
);
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
err_msgs
);
log
.
error
(
e
);
}
else
if
(
e
.
user_facing
)
{
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
[
e
.
message
]);
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
[
e
.
message
]);
log
.
error
(
e
);
}
else
{
throw
e
;
...
...
@@ -471,7 +472,7 @@ converse.plugins.add('converse-omemo', {
this
.
model
.
contact
.
getDisplayName
()
)];
}
return
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
messages
);
return
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
messages
);
}
ev
.
preventDefault
();
this
.
model
.
save
({
'
omemo_active
'
:
!
this
.
model
.
get
(
'
omemo_active
'
)});
...
...
@@ -500,7 +501,7 @@ converse.plugins.add('converse-omemo', {
}
async
function
getDevicesForContact
(
jid
)
{
await
_converse
.
api
.
waitUntil
(
'
OMEMOInitialized
'
);
await
api
.
waitUntil
(
'
OMEMOInitialized
'
);
const
devicelist
=
_converse
.
devicelists
.
get
(
jid
)
||
_converse
.
devicelists
.
create
({
'
jid
'
:
jid
});
await
devicelist
.
fetchDevices
();
return
devicelist
.
devices
;
...
...
@@ -828,7 +829,7 @@ converse.plugins.add('converse-omemo', {
Object
.
values
(
this
.
get
(
'
prekeys
'
)).
forEach
((
prekey
,
id
)
=>
item
.
c
(
'
preKeyPublic
'
,
{
'
preKeyId
'
:
id
}).
t
(
prekey
.
pubKey
).
up
());
const
options
=
{
'
pubsub#access_model
'
:
'
open
'
};
return
_converse
.
api
.
pubsub
.
publish
(
null
,
node
,
item
,
options
,
false
);
return
api
.
pubsub
.
publish
(
null
,
node
,
item
,
options
,
false
);
},
async
generateMissingPreKeys
()
{
...
...
@@ -933,7 +934,7 @@ converse.plugins.add('converse-omemo', {
let
iq
;
try
{
iq
=
await
_converse
.
api
.
sendIQ
(
stanza
)
iq
=
await
api
.
sendIQ
(
stanza
)
}
catch
(
iq
)
{
throw
new
IQError
(
"
Could not fetch bundle
"
,
iq
);
}
...
...
@@ -1037,7 +1038,7 @@ converse.plugins.add('converse-omemo', {
let
iq
;
try
{
iq
=
await
_converse
.
api
.
sendIQ
(
stanza
);
iq
=
await
api
.
sendIQ
(
stanza
);
}
catch
(
e
)
{
log
.
error
(
e
);
return
[];
...
...
@@ -1054,7 +1055,7 @@ converse.plugins.add('converse-omemo', {
const
item
=
$build
(
'
item
'
).
c
(
'
list
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
OMEMO
})
this
.
devices
.
filter
(
d
=>
d
.
get
(
'
active
'
)).
forEach
(
d
=>
item
.
c
(
'
device
'
,
{
'
id
'
:
d
.
get
(
'
id
'
)}).
up
());
const
options
=
{
'
pubsub#access_model
'
:
'
open
'
};
return
_converse
.
api
.
pubsub
.
publish
(
null
,
Strophe
.
NS
.
OMEMO_DEVICELIST
,
item
,
options
,
false
);
return
api
.
pubsub
.
publish
(
null
,
Strophe
.
NS
.
OMEMO_DEVICELIST
,
item
,
options
,
false
);
},
removeOwnDevices
(
device_ids
)
{
...
...
@@ -1193,7 +1194,7 @@ converse.plugins.add('converse-omemo', {
* @event _converse#OMEMOInitialized
* @example _converse.api.listen.on('OMEMOInitialized', () => { ... });
*/
_converse
.
api
.
trigger
(
'
OMEMOInitialized
'
);
api
.
trigger
(
'
OMEMOInitialized
'
);
}
async
function
onOccupantAdded
(
chatroom
,
occupant
)
{
...
...
@@ -1216,20 +1217,20 @@ converse.plugins.add('converse-omemo', {
async
function
checkOMEMOSupported
(
chatbox
)
{
let
supported
;
if
(
chatbox
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
)
{
await
_converse
.
api
.
waitUntil
(
'
OMEMOInitialized
'
);
await
api
.
waitUntil
(
'
OMEMOInitialized
'
);
supported
=
chatbox
.
features
.
get
(
'
nonanonymous
'
)
&&
chatbox
.
features
.
get
(
'
membersonly
'
);
}
else
if
(
chatbox
.
get
(
'
type
'
)
===
_converse
.
PRIVATE_CHAT_TYPE
)
{
supported
=
await
_converse
.
contactHasOMEMOSupport
(
chatbox
.
get
(
'
jid
'
));
}
chatbox
.
set
(
'
omemo_supported
'
,
supported
);
if
(
supported
&&
_converse
.
api
.
settings
.
get
(
'
omemo_default
'
))
{
if
(
supported
&&
api
.
settings
.
get
(
'
omemo_default
'
))
{
chatbox
.
set
(
'
omemo_active
'
,
true
);
}
}
/******************** Event Handlers ********************/
_converse
.
api
.
waitUntil
(
'
chatBoxesInitialized
'
).
then
(()
=>
api
.
waitUntil
(
'
chatBoxesInitialized
'
).
then
(()
=>
_converse
.
chatboxes
.
on
(
'
add
'
,
chatbox
=>
{
checkOMEMOSupported
(
chatbox
);
if
(
chatbox
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
)
{
...
...
@@ -1239,24 +1240,24 @@ converse.plugins.add('converse-omemo', {
})
);
_converse
.
api
.
listen
.
on
(
'
connected
'
,
registerPEPPushHandler
);
_converse
.
api
.
listen
.
on
(
'
renderToolbar
'
,
view
=>
view
.
renderOMEMOToolbarButton
());
_converse
.
api
.
listen
.
on
(
'
statusInitialized
'
,
initOMEMO
);
_converse
.
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
_converse
.
api
.
disco
.
own
.
features
.
add
(
`
${
Strophe
.
NS
.
OMEMO_DEVICELIST
}
+notify`
));
api
.
listen
.
on
(
'
connected
'
,
registerPEPPushHandler
);
api
.
listen
.
on
(
'
renderToolbar
'
,
view
=>
view
.
renderOMEMOToolbarButton
());
api
.
listen
.
on
(
'
statusInitialized
'
,
initOMEMO
);
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
api
.
disco
.
own
.
features
.
add
(
`
${
Strophe
.
NS
.
OMEMO_DEVICELIST
}
+notify`
));
_converse
.
api
.
listen
.
on
(
'
userDetailsModalInitialized
'
,
(
contact
)
=>
{
api
.
listen
.
on
(
'
userDetailsModalInitialized
'
,
(
contact
)
=>
{
const
jid
=
contact
.
get
(
'
jid
'
);
_converse
.
generateFingerprints
(
jid
).
catch
(
e
=>
log
.
error
(
e
));
});
_converse
.
api
.
listen
.
on
(
'
profileModalInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
profileModalInitialized
'
,
()
=>
{
_converse
.
generateFingerprints
(
_converse
.
bare_jid
).
catch
(
e
=>
log
.
error
(
e
));
});
_converse
.
api
.
listen
.
on
(
'
afterTearDown
'
,
()
=>
(
delete
_converse
.
omemo_store
));
api
.
listen
.
on
(
'
afterTearDown
'
,
()
=>
(
delete
_converse
.
omemo_store
));
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
if
(
_converse
.
shouldClearCache
()
&&
_converse
.
devicelists
)
{
_converse
.
devicelists
.
clearStore
();
delete
_converse
.
devicelists
;
...
...
src/converse-profile.js
View file @
030c26a8
...
...
@@ -27,10 +27,11 @@ converse.plugins.add('converse-profile', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
,
{
__
}
=
_converse
;
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
show_client_info
'
:
true
});
...
...
@@ -52,7 +53,7 @@ converse.plugins.add('converse-profile', {
* @type { _converse.XMPPStatus }
* @example _converse.api.listen.on('profileModalInitialized', status => { ... });
*/
_converse
.
api
.
trigger
(
'
profileModalInitialized
'
,
this
.
model
);
api
.
trigger
(
'
profileModalInitialized
'
,
this
.
model
);
},
toHTML
()
{
...
...
@@ -84,11 +85,11 @@ converse.plugins.add('converse-profile', {
},
setVCard
(
data
)
{
_converse
.
api
.
vcard
.
set
(
_converse
.
bare_jid
,
data
)
.
then
(()
=>
_converse
.
api
.
vcard
.
update
(
this
.
model
.
vcard
,
true
))
api
.
vcard
.
set
(
_converse
.
bare_jid
,
data
)
.
then
(()
=>
api
.
vcard
.
update
(
this
.
model
.
vcard
,
true
))
.
catch
((
err
)
=>
{
log
.
fatal
(
err
);
_converse
.
api
.
show
(
'
error
'
,
__
(
'
Error
'
),
[
api
.
show
(
'
error
'
,
__
(
'
Error
'
),
[
__
(
"
Sorry, an error happened while trying to save your profile data.
"
),
__
(
"
You can check your browser's developer console for any error output.
"
)
]);
...
...
@@ -251,7 +252,7 @@ converse.plugins.add('converse-profile', {
ev
.
preventDefault
();
const
result
=
confirm
(
__
(
"
Are you sure you want to log out?
"
));
if
(
result
===
true
)
{
_converse
.
api
.
user
.
logout
();
api
.
user
.
logout
();
}
},
...
...
@@ -274,8 +275,8 @@ converse.plugins.add('converse-profile', {
/******************** Event Handlers ********************/
_converse
.
api
.
listen
.
on
(
'
controlBoxPaneInitialized
'
,
async
view
=>
{
await
_converse
.
api
.
waitUntil
(
'
VCardsInitialized
'
);
api
.
listen
.
on
(
'
controlBoxPaneInitialized
'
,
async
view
=>
{
await
api
.
waitUntil
(
'
VCardsInitialized
'
);
_converse
.
xmppstatusview
=
new
_converse
.
XMPPStatusView
({
'
model
'
:
_converse
.
xmppstatus
});
view
.
el
.
insertAdjacentElement
(
'
afterBegin
'
,
_converse
.
xmppstatusview
.
render
().
el
);
});
...
...
src/converse-push.js
View file @
030c26a8
...
...
@@ -22,8 +22,9 @@ converse.plugins.add('converse-push', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
push_app_servers
'
:
[],
'
enable_muc_push
'
:
false
});
...
...
@@ -32,7 +33,7 @@ converse.plugins.add('converse-push', {
if
(
!
push_app_server
.
jid
)
{
return
;
}
if
(
!
(
await
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
PUSH
,
domain
||
_converse
.
bare_jid
)))
{
if
(
!
(
await
api
.
disco
.
supports
(
Strophe
.
NS
.
PUSH
,
domain
||
_converse
.
bare_jid
)))
{
log
.
warn
(
`Not disabling push app server "
${
push_app_server
.
jid
}
", no disco support from your server.`
);
return
;
}
...
...
@@ -47,7 +48,7 @@ converse.plugins.add('converse-push', {
if
(
push_app_server
.
node
)
{
stanza
.
attrs
({
'
node
'
:
push_app_server
.
node
});
}
_converse
.
api
.
sendIQ
(
stanza
)
api
.
sendIQ
(
stanza
)
.
catch
(
e
=>
{
log
.
error
(
`Could not disable push app server for
${
push_app_server
.
jid
}
`
);
log
.
error
(
e
);
...
...
@@ -58,15 +59,15 @@ converse.plugins.add('converse-push', {
if
(
!
push_app_server
.
jid
||
!
push_app_server
.
node
)
{
return
;
}
const
identity
=
await
_converse
.
api
.
disco
.
getIdentity
(
'
pubsub
'
,
'
push
'
,
push_app_server
.
jid
);
const
identity
=
await
api
.
disco
.
getIdentity
(
'
pubsub
'
,
'
push
'
,
push_app_server
.
jid
);
if
(
!
identity
)
{
return
log
.
warn
(
`Not enabling push the service "
${
push_app_server
.
jid
}
", it doesn't have the right disco identtiy.`
);
}
const
result
=
await
Promise
.
all
([
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
PUSH
,
push_app_server
.
jid
),
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
PUSH
,
domain
)
api
.
disco
.
supports
(
Strophe
.
NS
.
PUSH
,
push_app_server
.
jid
),
api
.
disco
.
supports
(
Strophe
.
NS
.
PUSH
,
domain
)
]);
if
(
!
result
[
0
]
&&
!
result
[
1
])
{
log
.
warn
(
`Not enabling push app server "
${
push_app_server
.
jid
}
", no disco support from your server.`
);
...
...
@@ -88,7 +89,7 @@ converse.plugins.add('converse-push', {
.
c
(
'
field
'
,
{
'
var
'
:
'
secret
'
})
.
c
(
'
value
'
).
t
(
push_app_server
.
secret
);
}
return
_converse
.
api
.
sendIQ
(
stanza
);
return
api
.
sendIQ
(
stanza
);
}
async
function
enablePush
(
domain
)
{
...
...
@@ -97,8 +98,8 @@ converse.plugins.add('converse-push', {
if
(
push_enabled
.
includes
(
domain
))
{
return
;
}
const
enabled_services
=
reject
(
_converse
.
api
.
settings
.
get
(
'
push_app_servers
'
),
'
disable
'
);
const
disabled_services
=
filter
(
_converse
.
api
.
settings
.
get
(
'
push_app_servers
'
),
'
disable
'
);
const
enabled_services
=
reject
(
api
.
settings
.
get
(
'
push_app_servers
'
),
'
disable
'
);
const
disabled_services
=
filter
(
api
.
settings
.
get
(
'
push_app_servers
'
),
'
disable
'
);
const
enabled
=
enabled_services
.
map
(
s
=>
enablePushAppServer
(
domain
,
s
));
const
disabled
=
disabled_services
.
map
(
s
=>
disablePushAppServer
(
domain
,
s
));
try
{
...
...
@@ -111,15 +112,15 @@ converse.plugins.add('converse-push', {
}
_converse
.
session
.
save
(
'
push_enabled
'
,
push_enabled
);
}
_converse
.
api
.
listen
.
on
(
'
statusInitialized
'
,
()
=>
enablePush
());
api
.
listen
.
on
(
'
statusInitialized
'
,
()
=>
enablePush
());
function
onChatBoxAdded
(
model
)
{
if
(
model
.
get
(
'
type
'
)
==
_converse
.
CHATROOMS_TYPE
)
{
enablePush
(
Strophe
.
getDomainFromJid
(
model
.
get
(
'
jid
'
)));
}
}
if
(
_converse
.
api
.
settings
.
get
(
'
enable_muc_push
'
))
{
_converse
.
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
_converse
.
chatboxes
.
on
(
'
add
'
,
onChatBoxAdded
));
if
(
api
.
settings
.
get
(
'
enable_muc_push
'
))
{
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
_converse
.
chatboxes
.
on
(
'
add
'
,
onChatBoxAdded
));
}
}
});
...
...
src/converse-register.js
View file @
030c26a8
...
...
@@ -7,6 +7,7 @@
* @license Mozilla Public License (MPLv2)
*/
import
"
converse-controlbox
"
;
import
{
__
}
from
'
@converse/headless/i18n
'
;
import
{
View
}
from
"
skeletor.js/src/view
"
;
import
{
pick
}
from
"
lodash
"
;
import
converse
from
"
@converse/headless/converse-core
"
;
...
...
@@ -63,15 +64,15 @@ converse.plugins.add('converse-register', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
,
{
__
}
=
_converse
;
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
CONNECTION_STATUS
[
Strophe
.
Status
.
REGIFAIL
]
=
'
REGIFAIL
'
;
_converse
.
CONNECTION_STATUS
[
Strophe
.
Status
.
REGISTERED
]
=
'
REGISTERED
'
;
_converse
.
CONNECTION_STATUS
[
Strophe
.
Status
.
CONFLICT
]
=
'
CONFLICT
'
;
_converse
.
CONNECTION_STATUS
[
Strophe
.
Status
.
NOTACCEPTABLE
]
=
'
NOTACCEPTABLE
'
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
allow_registration
'
:
true
,
'
domain_placeholder
'
:
__
(
"
e.g. conversejs.org
"
),
// Placeholder text shown in the domain input on the registration form
'
providers_link
'
:
'
https://compliance.conversations.im/
'
,
// Link to XMPP providers shown on registration page
...
...
@@ -95,7 +96,7 @@ converse.plugins.add('converse-register', {
},
renderRegistrationPanel
()
{
if
(
_converse
.
api
.
settings
.
get
(
'
allow_registration
'
))
{
if
(
api
.
settings
.
get
(
'
allow_registration
'
))
{
this
.
registerpanel
=
new
_converse
.
RegisterPanel
({
'
model
'
:
this
.
model
});
...
...
@@ -113,7 +114,7 @@ converse.plugins.add('converse-register', {
function
setActiveForm
(
value
)
{
_converse
.
api
.
waitUntil
(
'
controlBoxInitialized
'
).
then
(()
=>
{
api
.
waitUntil
(
'
controlBoxInitialized
'
).
then
(()
=>
{
const
controlbox
=
_converse
.
chatboxes
.
get
(
'
controlbox
'
)
controlbox
.
set
({
'
active-form
'
:
value
});
}).
catch
(
e
=>
log
.
fatal
(
e
));
...
...
@@ -138,22 +139,22 @@ converse.plugins.add('converse-register', {
initialize
()
{
this
.
reset
();
_converse
.
api
.
listen
.
on
(
'
connectionInitialized
'
,
()
=>
this
.
registerHooks
());
api
.
listen
.
on
(
'
connectionInitialized
'
,
()
=>
this
.
registerHooks
());
},
render
()
{
this
.
model
.
set
(
'
registration_form_rendered
'
,
false
);
this
.
el
.
innerHTML
=
tpl_register_panel
({
'
__
'
:
__
,
'
default_domain
'
:
_converse
.
api
.
settings
.
get
(
'
registration_domain
'
),
'
default_domain
'
:
api
.
settings
.
get
(
'
registration_domain
'
),
'
label_register
'
:
__
(
'
Fetch registration form
'
),
'
help_providers
'
:
__
(
'
Tip: A list of public XMPP providers is available
'
),
'
help_providers_link
'
:
__
(
'
here
'
),
'
href_providers
'
:
_converse
.
api
.
settings
.
get
(
'
providers_link
'
),
'
domain_placeholder
'
:
_converse
.
api
.
settings
.
get
(
'
domain_placeholder
'
)
'
href_providers
'
:
api
.
settings
.
get
(
'
providers_link
'
),
'
domain_placeholder
'
:
api
.
settings
.
get
(
'
domain_placeholder
'
)
});
if
(
_converse
.
api
.
settings
.
get
(
'
registration_domain
'
))
{
this
.
fetchRegistrationForm
(
_converse
.
api
.
settings
.
get
(
'
registration_domain
'
));
if
(
api
.
settings
.
get
(
'
registration_domain
'
))
{
this
.
fetchRegistrationForm
(
api
.
settings
.
get
(
'
registration_domain
'
));
}
return
this
;
},
...
...
@@ -324,7 +325,7 @@ converse.plugins.add('converse-register', {
'
beforeend
'
,
tpl_registration_request
({
'
__
'
:
_converse
.
__
,
'
cancel
'
:
_converse
.
api
.
settings
.
get
(
'
registration_domain
'
),
'
cancel
'
:
api
.
settings
.
get
(
'
registration_domain
'
),
})
);
},
...
...
@@ -447,11 +448,11 @@ converse.plugins.add('converse-register', {
renderRegistrationForm
(
stanza
)
{
const
form
=
this
.
el
.
querySelector
(
'
form
'
);
form
.
innerHTML
=
tpl_registration_form
({
'
__
'
:
_
converse
.
_
_
,
'
__
'
:
__
,
'
domain
'
:
this
.
domain
,
'
title
'
:
this
.
title
,
'
instructions
'
:
this
.
instructions
,
'
registration_domain
'
:
_converse
.
api
.
settings
.
get
(
'
registration_domain
'
)
'
registration_domain
'
:
api
.
settings
.
get
(
'
registration_domain
'
)
});
const
buttons
=
form
.
querySelector
(
'
fieldset.buttons
'
);
...
...
@@ -522,9 +523,9 @@ converse.plugins.add('converse-register', {
_converse
.
connection
.
_proto
.
_abortAllRequests
();
_converse
.
connection
.
reset
();
if
(
this
.
model
.
get
(
'
registration_form_rendered
'
))
{
if
(
_converse
.
api
.
settings
.
get
(
'
registration_domain
'
)
&&
this
.
model
.
get
(
'
registration_form_rendered
'
))
{
if
(
api
.
settings
.
get
(
'
registration_domain
'
)
&&
this
.
model
.
get
(
'
registration_form_rendered
'
))
{
this
.
fetchRegistrationForm
(
_converse
.
api
.
settings
.
get
(
'
registration_domain
'
)
api
.
settings
.
get
(
'
registration_domain
'
)
);
}
}
else
{
...
...
@@ -645,7 +646,7 @@ converse.plugins.add('converse-register', {
});
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
controlBoxInitialized
'
,
view
=>
{
api
.
listen
.
on
(
'
controlBoxInitialized
'
,
view
=>
{
view
.
model
.
on
(
'
change:active-form
'
,
view
.
showLoginOrRegisterForm
,
view
);
});
/************************ END Event Handlers ************************/
...
...
src/converse-roomslist.js
View file @
030c26a8
...
...
@@ -38,9 +38,10 @@ converse.plugins.add('converse-roomslist', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
// Promises exposed by this plugin
_converse
.
api
.
promises
.
add
(
'
roomsListInitialized
'
);
api
.
promises
.
add
(
'
roomsListInitialized
'
);
_converse
.
RoomsList
=
Model
.
extend
({
...
...
@@ -121,8 +122,8 @@ converse.plugins.add('converse-roomslist', {
const
data
=
{
'
name
'
:
name
||
Strophe
.
unescapeNode
(
Strophe
.
getNodeFromJid
(
jid
))
||
jid
}
await
_converse
.
api
.
rooms
.
open
(
jid
,
data
,
true
);
_converse
.
api
.
chatviews
.
get
(
jid
).
maybeFocus
();
await
api
.
rooms
.
open
(
jid
,
data
,
true
);
api
.
chatviews
.
get
(
jid
).
maybeFocus
();
},
closeRoom
(
ev
)
{
...
...
@@ -164,22 +165,22 @@ converse.plugins.add('converse-roomslist', {
* @event _converse#roomsListInitialized
* @example _converse.api.listen.on('roomsListInitialized', status => { ... });
*/
_converse
.
api
.
trigger
(
'
roomsListInitialized
'
);
api
.
trigger
(
'
roomsListInitialized
'
);
};
_converse
.
api
.
listen
.
on
(
'
connected
'
,
async
()
=>
{
api
.
listen
.
on
(
'
connected
'
,
async
()
=>
{
if
(
_converse
.
allow_bookmarks
)
{
await
_converse
.
api
.
waitUntil
(
'
bookmarksInitialized
'
);
await
api
.
waitUntil
(
'
bookmarksInitialized
'
);
}
else
{
await
Promise
.
all
([
_converse
.
api
.
waitUntil
(
'
chatBoxesFetched
'
),
_converse
.
api
.
waitUntil
(
'
roomsPanelRendered
'
)
api
.
waitUntil
(
'
chatBoxesFetched
'
),
api
.
waitUntil
(
'
roomsPanelRendered
'
)
]);
}
initRoomsListView
();
});
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
initRoomsListView
);
api
.
listen
.
on
(
'
reconnected
'
,
initRoomsListView
);
}
});
src/converse-rosterview.js
View file @
030c26a8
...
...
@@ -33,10 +33,11 @@ converse.plugins.add('converse-rosterview', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
,
{
__
}
=
_converse
;
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
autocomplete_add_contact
'
:
true
,
'
allow_chat_pending_contacts
'
:
true
,
'
allow_contact_removal
'
:
true
,
...
...
@@ -44,7 +45,7 @@ converse.plugins.add('converse-rosterview', {
'
roster_groups
'
:
true
,
'
xhr_user_search_url
'
:
null
,
});
_converse
.
api
.
promises
.
add
(
'
rosterViewInitialized
'
);
api
.
promises
.
add
(
'
rosterViewInitialized
'
);
const
STATUSES
=
{
'
dnd
'
:
__
(
'
This contact is busy
'
),
...
...
@@ -68,7 +69,7 @@ converse.plugins.add('converse-rosterview', {
},
toHTML
()
{
const
label_nickname
=
_converse
.
api
.
settings
.
get
(
'
xhr_user_search_url
'
)
?
__
(
'
Contact name
'
)
:
__
(
'
Optional nickname
'
);
const
label_nickname
=
api
.
settings
.
get
(
'
xhr_user_search_url
'
)
?
__
(
'
Contact name
'
)
:
__
(
'
Optional nickname
'
);
return
tpl_add_contact_modal
(
Object
.
assign
(
this
.
model
.
toJSON
(),
{
'
_converse
'
:
_converse
,
'
label_nickname
'
:
label_nickname
,
...
...
@@ -76,7 +77,7 @@ converse.plugins.add('converse-rosterview', {
},
afterRender
()
{
if
(
_converse
.
api
.
settings
.
get
(
'
xhr_user_search_url
'
)
&&
isString
(
_converse
.
api
.
settings
.
get
(
'
xhr_user_search_url
'
)))
{
if
(
api
.
settings
.
get
(
'
xhr_user_search_url
'
)
&&
isString
(
api
.
settings
.
get
(
'
xhr_user_search_url
'
)))
{
this
.
initXHRAutoComplete
();
}
else
{
this
.
initJIDAutoComplete
();
...
...
@@ -86,7 +87,7 @@ converse.plugins.add('converse-rosterview', {
},
initJIDAutoComplete
()
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
autocomplete_add_contact
'
))
{
if
(
!
api
.
settings
.
get
(
'
autocomplete_add_contact
'
))
{
return
;
}
const
el
=
this
.
el
.
querySelector
(
'
.suggestion-box__jid
'
).
parentElement
;
...
...
@@ -98,7 +99,7 @@ converse.plugins.add('converse-rosterview', {
},
initXHRAutoComplete
()
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
autocomplete_add_contact
'
))
{
if
(
!
api
.
settings
.
get
(
'
autocomplete_add_contact
'
))
{
return
this
.
initXHRFetch
();
}
const
el
=
this
.
el
.
querySelector
(
'
.suggestion-box__name
'
).
parentElement
;
...
...
@@ -119,7 +120,7 @@ converse.plugins.add('converse-rosterview', {
};
const
input_el
=
this
.
el
.
querySelector
(
'
input[name="name"]
'
);
input_el
.
addEventListener
(
'
input
'
,
debounce
(()
=>
{
xhr
.
open
(
"
GET
"
,
`
${
_converse
.
api
.
settings
.
get
(
'
xhr_user_search_url
'
)}
q=
${
encodeURIComponent
(
input_el
.
value
)}
`
,
true
);
xhr
.
open
(
"
GET
"
,
`
${
api
.
settings
.
get
(
'
xhr_user_search_url
'
)}
q=
${
encodeURIComponent
(
input_el
.
value
)}
`
,
true
);
xhr
.
send
()
}
,
300
));
this
.
name_auto_complete
.
on
(
'
suggestion-box-selectcomplete
'
,
ev
=>
{
...
...
@@ -176,9 +177,9 @@ converse.plugins.add('converse-rosterview', {
const
data
=
new
FormData
(
ev
.
target
),
jid
=
(
data
.
get
(
'
jid
'
)
||
''
).
trim
();
if
(
!
jid
&&
_converse
.
api
.
settings
.
get
(
'
xhr_user_search_url
'
)
&&
isString
(
_converse
.
api
.
settings
.
get
(
'
xhr_user_search_url
'
)))
{
if
(
!
jid
&&
api
.
settings
.
get
(
'
xhr_user_search_url
'
)
&&
isString
(
api
.
settings
.
get
(
'
xhr_user_search_url
'
)))
{
const
input_el
=
this
.
el
.
querySelector
(
'
input[name="name"]
'
);
this
.
xhr
.
open
(
"
GET
"
,
`
${
_converse
.
api
.
settings
.
get
(
'
xhr_user_search_url
'
)}
q=
${
encodeURIComponent
(
input_el
.
value
)}
`
,
true
);
this
.
xhr
.
open
(
"
GET
"
,
`
${
api
.
settings
.
get
(
'
xhr_user_search_url
'
)}
q=
${
encodeURIComponent
(
input_el
.
value
)}
`
,
true
);
this
.
xhr
.
send
()
return
;
}
...
...
@@ -357,7 +358,7 @@ converse.plugins.add('converse-rosterview', {
Object
.
assign
(
this
.
model
.
toJSON
(),
{
display_name
,
'
desc_remove
'
:
__
(
'
Click to remove %1$s as a contact
'
,
display_name
),
'
allow_chat_pending_contacts
'
:
_converse
.
api
.
settings
.
get
(
'
allow_chat_pending_contacts
'
)
'
allow_chat_pending_contacts
'
:
api
.
settings
.
get
(
'
allow_chat_pending_contacts
'
)
})
);
}
else
if
(
requesting
===
true
)
{
...
...
@@ -368,7 +369,7 @@ converse.plugins.add('converse-rosterview', {
display_name
,
'
desc_accept
'
:
__
(
"
Click to accept the contact request from %1$s
"
,
display_name
),
'
desc_decline
'
:
__
(
"
Click to decline the contact request from %1$s
"
,
display_name
),
'
allow_chat_pending_contacts
'
:
_converse
.
api
.
settings
.
get
(
'
allow_chat_pending_contacts
'
)
'
allow_chat_pending_contacts
'
:
api
.
settings
.
get
(
'
allow_chat_pending_contacts
'
)
})
);
}
else
if
(
subscription
===
'
both
'
||
subscription
===
'
to
'
||
_converse
.
rosterview
.
isSelf
(
jid
))
{
...
...
@@ -419,7 +420,7 @@ converse.plugins.add('converse-rosterview', {
'
desc_status
'
:
STATUSES
[
show
],
'
desc_chat
'
:
__
(
'
Click to chat with %1$s (JID: %2$s)
'
,
display_name
,
item
.
get
(
'
jid
'
)),
'
desc_remove
'
:
__
(
'
Click to remove %1$s as a contact
'
,
display_name
),
'
allow_contact_removal
'
:
_converse
.
api
.
settings
.
get
(
'
allow_contact_removal
'
),
'
allow_contact_removal
'
:
api
.
settings
.
get
(
'
allow_contact_removal
'
),
'
num_unread
'
:
item
.
get
(
'
num_unread
'
)
||
0
,
classes
:
''
})
...
...
@@ -438,7 +439,7 @@ converse.plugins.add('converse-rosterview', {
*/
mayBeShown
()
{
const
chatStatus
=
this
.
model
.
presence
.
get
(
'
show
'
);
if
(
_converse
.
api
.
settings
.
get
(
'
hide_offline_users
'
)
&&
chatStatus
===
'
offline
'
)
{
if
(
api
.
settings
.
get
(
'
hide_offline_users
'
)
&&
chatStatus
===
'
offline
'
)
{
// If pending or requesting, show
if
((
this
.
model
.
get
(
'
ask
'
)
===
'
subscribe
'
)
||
(
this
.
model
.
get
(
'
subscription
'
)
===
'
from
'
)
||
...
...
@@ -453,12 +454,12 @@ converse.plugins.add('converse-rosterview', {
openChat
(
ev
)
{
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
const
attrs
=
this
.
model
.
attributes
;
_converse
.
api
.
chats
.
open
(
attrs
.
jid
,
attrs
,
true
);
api
.
chats
.
open
(
attrs
.
jid
,
attrs
,
true
);
},
async
removeContact
(
ev
)
{
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
if
(
!
_converse
.
api
.
settings
.
get
(
'
allow_contact_removal
'
))
{
return
;
}
if
(
!
api
.
settings
.
get
(
'
allow_contact_removal
'
))
{
return
;
}
if
(
!
confirm
(
__
(
"
Are you sure you want to remove this contact?
"
)))
{
return
;
}
try
{
...
...
@@ -471,7 +472,7 @@ converse.plugins.add('converse-rosterview', {
}
}
catch
(
e
)
{
log
.
error
(
e
);
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
[
__
(
'
Sorry, there was an error while trying to remove %1$s as a contact.
'
,
this
.
model
.
getDisplayName
())]
);
}
...
...
@@ -744,9 +745,9 @@ converse.plugins.add('converse-rosterview', {
// just this group's) have been fetched from browser
// storage or the XMPP server and once they've been
// assigned to their various groups.
_converse
.
api
.
listen
.
on
(
'
rosterGroupsFetched
'
,
this
.
sortAndPositionAllItems
.
bind
(
this
));
api
.
listen
.
on
(
'
rosterGroupsFetched
'
,
this
.
sortAndPositionAllItems
.
bind
(
this
));
_converse
.
api
.
listen
.
on
(
'
rosterContactsFetched
'
,
()
=>
{
api
.
listen
.
on
(
'
rosterContactsFetched
'
,
()
=>
{
_converse
.
roster
.
each
(
contact
=>
this
.
addRosterContact
(
contact
,
{
'
silent
'
:
true
}));
this
.
update
();
this
.
updateFilter
();
...
...
@@ -892,7 +893,7 @@ converse.plugins.add('converse-rosterview', {
addExistingContact
(
contact
,
options
)
{
let
groups
;
if
(
_converse
.
api
.
settings
.
get
(
'
roster_groups
'
))
{
if
(
api
.
settings
.
get
(
'
roster_groups
'
))
{
groups
=
contact
.
get
(
'
groups
'
);
groups
=
(
groups
.
length
===
0
)
?
[
_converse
.
HEADER_UNGROUPED
]
:
groups
;
}
else
{
...
...
@@ -931,7 +932,7 @@ converse.plugins.add('converse-rosterview', {
});
/* -------- Event Handlers ----------- */
_converse
.
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
{
function
highlightRosterItem
(
chatbox
)
{
const
contact
=
_converse
.
roster
&&
_converse
.
roster
.
findWhere
({
'
jid
'
:
chatbox
.
get
(
'
jid
'
)});
if
(
contact
!==
undefined
)
{
...
...
@@ -943,13 +944,13 @@ converse.plugins.add('converse-rosterview', {
});
_converse
.
api
.
listen
.
on
(
'
controlBoxInitialized
'
,
(
view
)
=>
{
api
.
listen
.
on
(
'
controlBoxInitialized
'
,
(
view
)
=>
{
function
insertRoster
()
{
if
(
!
view
.
model
.
get
(
'
connected
'
)
||
_converse
.
api
.
settings
.
get
(
"
authentication
"
)
===
_converse
.
ANONYMOUS
)
{
if
(
!
view
.
model
.
get
(
'
connected
'
)
||
api
.
settings
.
get
(
"
authentication
"
)
===
_converse
.
ANONYMOUS
)
{
return
;
}
/* Place the rosterview inside the "Contacts" panel. */
_converse
.
api
.
waitUntil
(
'
rosterViewInitialized
'
)
api
.
waitUntil
(
'
rosterViewInitialized
'
)
.
then
(()
=>
view
.
controlbox_pane
.
el
.
insertAdjacentElement
(
'
beforeEnd
'
,
_converse
.
rosterview
.
el
))
.
catch
(
e
=>
log
.
fatal
(
e
));
}
...
...
@@ -962,7 +963,7 @@ converse.plugins.add('converse-rosterview', {
/* Create an instance of RosterView once the RosterGroups
* collection has been created (in @converse/headless/converse-core.js)
*/
if
(
_converse
.
api
.
settings
.
get
(
"
authentication
"
)
===
_converse
.
ANONYMOUS
)
{
if
(
api
.
settings
.
get
(
"
authentication
"
)
===
_converse
.
ANONYMOUS
)
{
return
;
}
_converse
.
rosterview
=
new
_converse
.
RosterView
({
...
...
@@ -974,12 +975,12 @@ converse.plugins.add('converse-rosterview', {
* @event _converse#rosterViewInitialized
* @example _converse.api.listen.on('rosterViewInitialized', () => { ... });
*/
_converse
.
api
.
trigger
(
'
rosterViewInitialized
'
);
api
.
trigger
(
'
rosterViewInitialized
'
);
}
_converse
.
api
.
listen
.
on
(
'
rosterInitialized
'
,
initRosterView
);
_converse
.
api
.
listen
.
on
(
'
rosterReadyAfterReconnection
'
,
initRosterView
);
api
.
listen
.
on
(
'
rosterInitialized
'
,
initRosterView
);
api
.
listen
.
on
(
'
rosterReadyAfterReconnection
'
,
initRosterView
);
_converse
.
api
.
listen
.
on
(
'
afterTearDown
'
,
()
=>
{
api
.
listen
.
on
(
'
afterTearDown
'
,
()
=>
{
if
(
converse
.
rosterview
)
{
converse
.
rosterview
.
model
.
off
().
reset
();
converse
.
rosterview
.
each
(
groupview
=>
groupview
.
removeAll
().
remove
());
...
...
src/headless/converse-bookmarks.js
View file @
030c26a8
...
...
@@ -60,20 +60,21 @@ converse.plugins.add('converse-bookmarks', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
,
{
__
}
=
_converse
;
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
allow_bookmarks
:
true
,
allow_public_bookmarks
:
false
,
muc_respect_autojoin
:
true
});
_converse
.
api
.
promises
.
add
(
'
bookmarksInitialized
'
);
api
.
promises
.
add
(
'
bookmarksInitialized
'
);
/**
* Check if the user has a bookmark with a saved nickanme
...
...
@@ -82,7 +83,7 @@ converse.plugins.add('converse-bookmarks', {
* @method _converse#getNicknameFromBookmark
*/
_converse
.
getNicknameFromBookmark
=
function
(
jid
)
{
if
(
!
_converse
.
bookmarks
||
!
_converse
.
api
.
settings
.
get
(
'
allow_bookmarks
'
))
{
if
(
!
_converse
.
bookmarks
||
!
api
.
settings
.
get
(
'
allow_bookmarks
'
))
{
return
null
;
}
const
bookmark
=
_converse
.
bookmarks
.
findWhere
({
'
jid
'
:
jid
});
...
...
@@ -116,8 +117,8 @@ converse.plugins.add('converse-bookmarks', {
},
async
openBookmarkedRoom
(
bookmark
)
{
if
(
_converse
.
api
.
settings
.
get
(
'
muc_respect_autojoin
'
)
&&
bookmark
.
get
(
'
autojoin
'
))
{
const
groupchat
=
await
_converse
.
api
.
rooms
.
create
(
bookmark
.
get
(
'
jid
'
),
bookmark
.
get
(
'
nick
'
));
if
(
api
.
settings
.
get
(
'
muc_respect_autojoin
'
)
&&
bookmark
.
get
(
'
autojoin
'
))
{
const
groupchat
=
await
api
.
rooms
.
create
(
bookmark
.
get
(
'
jid
'
),
bookmark
.
get
(
'
nick
'
));
groupchat
.
maybeShow
();
}
return
bookmark
;
...
...
@@ -166,13 +167,13 @@ converse.plugins.add('converse-bookmarks', {
.
c
(
'
value
'
).
t
(
'
true
'
).
up
().
up
()
.
c
(
'
field
'
,
{
'
var
'
:
'
pubsub#access_model
'
})
.
c
(
'
value
'
).
t
(
'
whitelist
'
);
return
_converse
.
api
.
sendIQ
(
stanza
);
return
api
.
sendIQ
(
stanza
);
},
onBookmarkError
(
iq
,
options
)
{
log
.
error
(
"
Error while trying to add bookmark
"
);
log
.
error
(
iq
);
_converse
.
api
.
alert
(
api
.
alert
(
'
error
'
,
__
(
'
Error
'
),
[
__
(
"
Sorry, something went wrong while trying to save your bookmark.
"
)]
);
this
.
findWhere
({
'
jid
'
:
options
.
jid
}).
destroy
();
...
...
@@ -184,7 +185,7 @@ converse.plugins.add('converse-bookmarks', {
'
type
'
:
'
get
'
,
}).
c
(
'
pubsub
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
PUBSUB
})
.
c
(
'
items
'
,
{
'
node
'
:
'
storage:bookmarks
'
});
_converse
.
api
.
sendIQ
(
stanza
)
api
.
sendIQ
(
stanza
)
.
then
(
iq
=>
this
.
onBookmarksReceived
(
deferred
,
iq
))
.
catch
(
iq
=>
this
.
onBookmarksReceivedError
(
deferred
,
iq
)
);
...
...
@@ -231,7 +232,7 @@ converse.plugins.add('converse-bookmarks', {
onBookmarksReceivedError
(
deferred
,
iq
)
{
if
(
iq
===
null
)
{
log
.
error
(
'
Error: timeout while fetching bookmarks
'
);
_converse
.
api
.
alert
(
'
error
'
,
__
(
'
Timeout Error
'
),
api
.
alert
(
'
error
'
,
__
(
'
Timeout Error
'
),
[
__
(
"
The server did not return your bookmarks within the allowed time.
"
+
"
You can reload the page to request them again.
"
)]
);
...
...
@@ -263,16 +264,16 @@ converse.plugins.add('converse-bookmarks', {
});
_converse
.
checkBookmarksSupport
=
async
function
()
{
const
identity
=
await
_converse
.
api
.
disco
.
getIdentity
(
'
pubsub
'
,
'
pep
'
,
_converse
.
bare_jid
);
const
identity
=
await
api
.
disco
.
getIdentity
(
'
pubsub
'
,
'
pep
'
,
_converse
.
bare_jid
);
if
(
_converse
.
allow_public_bookmarks
)
{
return
!!
identity
;
}
else
{
return
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
PUBSUB
+
'
#publish-options
'
,
_converse
.
bare_jid
);
return
api
.
disco
.
supports
(
Strophe
.
NS
.
PUBSUB
+
'
#publish-options
'
,
_converse
.
bare_jid
);
}
}
const
initBookmarks
=
async
function
()
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
allow_bookmarks
'
))
{
if
(
!
api
.
settings
.
get
(
'
allow_bookmarks
'
))
{
return
;
}
if
(
await
_converse
.
checkBookmarksSupport
())
{
...
...
@@ -284,11 +285,11 @@ converse.plugins.add('converse-bookmarks', {
* @event _converse#bookmarksInitialized
* @example _converse.api.listen.on('bookmarksInitialized', () => { ... });
*/
_converse
.
api
.
trigger
(
'
bookmarksInitialized
'
);
api
.
trigger
(
'
bookmarksInitialized
'
);
}
}
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
if
(
_converse
.
bookmarks
!==
undefined
)
{
_converse
.
bookmarks
.
clearStore
({
'
silent
'
:
true
});
window
.
sessionStorage
.
removeItem
(
_converse
.
bookmarks
.
fetched_flag
);
...
...
@@ -296,19 +297,19 @@ converse.plugins.add('converse-bookmarks', {
}
});
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
initBookmarks
);
api
.
listen
.
on
(
'
reconnected
'
,
initBookmarks
);
_converse
.
api
.
listen
.
on
(
'
connected
'
,
async
()
=>
{
api
.
listen
.
on
(
'
connected
'
,
async
()
=>
{
// Add a handler for bookmarks pushed from other connected clients
_converse
.
connection
.
addHandler
(
message
=>
{
if
(
sizzle
(
'
event[xmlns="
'
+
Strophe
.
NS
.
PUBSUB
+
'
#event"] items[node="storage:bookmarks"]
'
,
message
).
length
)
{
_converse
.
api
.
waitUntil
(
'
bookmarksInitialized
'
)
api
.
waitUntil
(
'
bookmarksInitialized
'
)
.
then
(()
=>
_converse
.
bookmarks
.
createBookmarksFromStanza
(
message
))
.
catch
(
e
=>
log
.
fatal
(
e
));
}
},
null
,
'
message
'
,
'
headline
'
,
null
,
_converse
.
bare_jid
);
await
Promise
.
all
([
_converse
.
api
.
waitUntil
(
'
chatBoxesFetched
'
)]);
await
Promise
.
all
([
api
.
waitUntil
(
'
chatBoxesFetched
'
)]);
initBookmarks
();
});
}
...
...
src/headless/converse-bosh.js
View file @
030c26a8
...
...
@@ -22,8 +22,9 @@ converse.plugins.add('converse-bosh', {
initialize
()
{
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
bosh_service_url
:
undefined
,
prebind_url
:
null
});
...
...
@@ -51,11 +52,11 @@ converse.plugins.add('converse-bosh', {
_converse
.
startNewPreboundBOSHSession
=
function
()
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
prebind_url
'
))
{
if
(
!
api
.
settings
.
get
(
'
prebind_url
'
))
{
throw
new
Error
(
"
startNewPreboundBOSHSession: If you use prebind then you MUST supply a prebind_url
"
);
}
const
xhr
=
new
XMLHttpRequest
();
xhr
.
open
(
'
GET
'
,
_converse
.
api
.
settings
.
get
(
'
prebind_url
'
),
true
);
xhr
.
open
(
'
GET
'
,
api
.
settings
.
get
(
'
prebind_url
'
),
true
);
xhr
.
setRequestHeader
(
'
Accept
'
,
'
application/json, text/javascript
'
);
xhr
.
onload
=
async
function
()
{
if
(
xhr
.
status
>=
200
&&
xhr
.
status
<
400
)
{
...
...
@@ -79,7 +80,7 @@ converse.plugins.add('converse-bosh', {
* @type { _converse }
* @example _converse.api.listen.on('noResumeableBOSHSession', _converse => { ... });
*/
_converse
.
api
.
trigger
(
'
noResumeableBOSHSession
'
,
_converse
);
api
.
trigger
(
'
noResumeableBOSHSession
'
,
_converse
);
};
xhr
.
send
();
}
...
...
@@ -101,7 +102,7 @@ converse.plugins.add('converse-bosh', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
if
(
_converse
.
bosh_session
===
undefined
)
{
// Remove manually, even if we don't have the corresponding
// model, to avoid trying to reconnect to a stale BOSH session
...
...
@@ -114,28 +115,28 @@ converse.plugins.add('converse-bosh', {
}
});
_converse
.
api
.
listen
.
on
(
'
setUserJID
'
,
()
=>
{
api
.
listen
.
on
(
'
setUserJID
'
,
()
=>
{
if
(
_converse
.
bosh_session
!==
undefined
)
{
_converse
.
bosh_session
.
save
({
'
jid
'
:
_converse
.
jid
});
}
});
_converse
.
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
BOSH
));
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
BOSH
));
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* This namespace lets you access the BOSH tokens
*
* @namespace
_converse.
api.tokens
* @memberOf
_converse.
api
* @namespace api.tokens
* @memberOf api
*/
tokens
:
{
/**
* @method
_converse.
api.tokens.get
* @method api.tokens.get
* @param {string} [id] The type of token to return ('rid' or 'sid').
* @returns 'string' A token, either the RID or SID token depending on what's asked for.
* @example _converse.api.tokens.get('rid');
...
...
src/headless/converse-chat.js
View file @
030c26a8
...
...
@@ -35,13 +35,14 @@ converse.plugins.add('converse-chat', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
allow_message_corrections
'
:
'
all
'
,
'
allow_message_retraction
'
:
'
all
'
,
'
auto_join_private_chats
'
:
[],
...
...
@@ -58,7 +59,7 @@ converse.plugins.add('converse-chat', {
},
async
setRosterContact
(
jid
)
{
const
contact
=
await
_converse
.
api
.
contacts
.
get
(
jid
);
const
contact
=
await
api
.
contacts
.
get
(
jid
);
if
(
contact
)
{
this
.
contact
=
contact
;
this
.
set
(
'
nickname
'
,
contact
.
get
(
'
nickname
'
));
...
...
@@ -103,7 +104,7 @@ converse.plugins.add('converse-chat', {
* @type { _converse.Message}
* @example _converse.api.listen.on('messageInitialized', model => { ... });
*/
await
_converse
.
api
.
trigger
(
'
messageInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
await
api
.
trigger
(
'
messageInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
this
.
initialized
.
resolve
();
},
...
...
@@ -151,7 +152,7 @@ converse.plugins.add('converse-chat', {
*/
mayBeRetracted
()
{
const
is_own_message
=
this
.
get
(
'
sender
'
)
===
'
me
'
;
return
is_own_message
&&
[
'
all
'
,
'
own
'
].
includes
(
_converse
.
api
.
settings
.
get
(
'
allow_message_retraction
'
));
return
is_own_message
&&
[
'
all
'
,
'
own
'
].
includes
(
api
.
settings
.
get
(
'
allow_message_retraction
'
));
},
safeDestroy
()
{
...
...
@@ -212,7 +213,7 @@ converse.plugins.add('converse-chat', {
'
size
'
:
this
.
file
.
size
,
'
content-type
'
:
this
.
file
.
type
})
return
_converse
.
api
.
sendIQ
(
iq
);
return
api
.
sendIQ
(
iq
);
},
async
getRequestSlotURL
()
{
...
...
@@ -306,7 +307,7 @@ converse.plugins.add('converse-chat', {
return
{
'
bookmarked
'
:
false
,
'
chat_state
'
:
undefined
,
'
hidden
'
:
[
'
mobile
'
,
'
fullscreen
'
].
includes
(
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)),
'
hidden
'
:
[
'
mobile
'
,
'
fullscreen
'
].
includes
(
api
.
settings
.
get
(
"
view_mode
"
)),
'
message_type
'
:
'
chat
'
,
'
nickname
'
:
undefined
,
'
num_unread
'
:
0
,
...
...
@@ -347,7 +348,7 @@ converse.plugins.add('converse-chat', {
* @type { _converse.ChatBox}
* @example _converse.api.listen.on('chatBoxInitialized', model => { ... });
*/
await
_converse
.
api
.
trigger
(
'
chatBoxInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
await
api
.
trigger
(
'
chatBoxInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
this
.
initialized
.
resolve
();
},
...
...
@@ -361,7 +362,7 @@ converse.plugins.add('converse-chat', {
this
.
messages
.
browserStorage
=
_converse
.
createStore
(
this
.
getMessagesCacheKey
());
this
.
listenTo
(
this
.
messages
,
'
change:upload
'
,
message
=>
{
if
(
message
.
get
(
'
upload
'
)
===
_converse
.
SUCCESS
)
{
_converse
.
api
.
send
(
this
.
createMessageStanza
(
message
));
api
.
send
(
this
.
createMessageStanza
(
message
));
}
});
},
...
...
@@ -378,7 +379,7 @@ converse.plugins.add('converse-chat', {
* @type {_converse.ChatBox | _converse.ChatRoom}
* @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
*/
_converse
.
api
.
trigger
(
'
afterMessagesFetched
'
,
this
);
api
.
trigger
(
'
afterMessagesFetched
'
,
this
);
},
fetchMessages
()
{
...
...
@@ -453,7 +454,7 @@ converse.plugins.add('converse-chat', {
}
catch
(
e
)
{
log
.
error
(
e
);
}
finally
{
if
(
_converse
.
api
.
settings
.
get
(
'
clear_messages_on_reconnection
'
))
{
if
(
api
.
settings
.
get
(
'
clear_messages_on_reconnection
'
))
{
await
this
.
clearMessages
();
}
}
...
...
@@ -466,11 +467,11 @@ converse.plugins.add('converse-chat', {
* @type {_converse.ChatBox | _converse.ChatRoom}
* @example _converse.api.listen.on('onChatReconnected', chatbox => { ... });
*/
_converse
.
api
.
trigger
(
'
chatReconnected
'
,
this
);
api
.
trigger
(
'
chatReconnected
'
,
this
);
},
async
onReconnection
()
{
if
(
_converse
.
api
.
settings
.
get
(
'
clear_messages_on_reconnection
'
))
{
if
(
api
.
settings
.
get
(
'
clear_messages_on_reconnection
'
))
{
await
this
.
clearMessages
();
}
this
.
announceReconnection
();
...
...
@@ -481,8 +482,8 @@ converse.plugins.add('converse-chat', {
return
'
Ignored ChatBox without JID
'
;
}
const
room_jids
=
_converse
.
auto_join_rooms
.
map
(
s
=>
isObject
(
s
)
?
s
.
jid
:
s
);
const
auto_join
=
_converse
.
api
.
settings
.
get
(
'
auto_join_private_chats
'
).
concat
(
room_jids
);
if
(
_converse
.
api
.
settings
.
get
(
"
singleton
"
)
&&
!
auto_join
.
includes
(
attrs
.
jid
)
&&
!
_converse
.
auto_join_on_invite
)
{
const
auto_join
=
api
.
settings
.
get
(
'
auto_join_private_chats
'
).
concat
(
room_jids
);
if
(
api
.
settings
.
get
(
"
singleton
"
)
&&
!
auto_join
.
includes
(
attrs
.
jid
)
&&
!
_converse
.
auto_join_on_invite
)
{
const
msg
=
`
${
attrs
.
jid
}
is not allowed because singleton is true and it's not being auto_joined`
;
log
.
warn
(
msg
);
return
msg
;
...
...
@@ -793,7 +794,7 @@ converse.plugins.add('converse-chat', {
'
to
'
:
to_jid
,
'
type
'
:
'
chat
'
,
}).
c
(
type
,
{
'
xmlns
'
:
Strophe
.
NS
.
MARKERS
,
'
id
'
:
id
});
_converse
.
api
.
send
(
stanza
);
api
.
send
(
stanza
);
},
handleChatMarker
(
stanza
,
from_jid
)
{
...
...
@@ -836,7 +837,7 @@ converse.plugins.add('converse-chat', {
'
type
'
:
'
chat
'
,
}).
c
(
'
received
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
RECEIPTS
,
'
id
'
:
id
}).
up
()
.
c
(
'
store
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
HINTS
}).
up
();
_converse
.
api
.
send
(
receipt_stanza
);
api
.
send
(
receipt_stanza
);
},
handleReceipt
(
stanza
,
original_stanza
,
from_jid
)
{
...
...
@@ -936,7 +937,7 @@ converse.plugins.add('converse-chat', {
/**
* Responsible for setting the editable attribute of messages.
* If
_converse.
api.settings.get('allow_message_corrections') is "last", then only the last
* If api.settings.get('allow_message_corrections') is "last", then only the last
* message sent from me will be editable. If set to "all" all messages
* will be editable. Otherwise no messages will be editable.
* @method _converse.ChatBox#setEditable
...
...
@@ -951,9 +952,9 @@ converse.plugins.add('converse-chat', {
if
(
u
.
isEmptyMessage
(
attrs
)
||
attrs
.
sender
!==
'
me
'
)
{
return
;
}
if
(
_converse
.
api
.
settings
.
get
(
'
allow_message_corrections
'
)
===
'
all
'
)
{
if
(
api
.
settings
.
get
(
'
allow_message_corrections
'
)
===
'
all
'
)
{
attrs
.
editable
=
!
(
attrs
.
file
||
attrs
.
retracted
||
'
oob_url
'
in
attrs
);
}
else
if
((
_converse
.
api
.
settings
.
get
(
'
allow_message_corrections
'
)
===
'
last
'
)
&&
(
send_time
>
this
.
get
(
'
time_sent
'
)))
{
}
else
if
((
api
.
settings
.
get
(
'
allow_message_corrections
'
)
===
'
last
'
)
&&
(
send_time
>
this
.
get
(
'
time_sent
'
)))
{
this
.
set
({
'
time_sent
'
:
send_time
});
const
msg
=
this
.
messages
.
findWhere
({
'
editable
'
:
true
});
if
(
msg
)
{
...
...
@@ -981,7 +982,7 @@ converse.plugins.add('converse-chat', {
* @param { String } spoiler_hint - An optional hint, if the message being sent is a spoiler
* @returns { _converse.Message }
* @example
* const chat =
_converse.
api.chats.get('buddy1@example.com');
* const chat = api.chats.get('buddy1@example.com');
* chat.sendMessage('hello world');
*/
async
sendMessage
(
text
,
spoiler_hint
)
{
...
...
@@ -1004,7 +1005,7 @@ converse.plugins.add('converse-chat', {
this
.
setEditable
(
attrs
,
(
new
Date
()).
toISOString
());
message
=
await
this
.
createMessage
(
attrs
);
}
_converse
.
api
.
send
(
this
.
createMessageStanza
(
message
));
api
.
send
(
this
.
createMessageStanza
(
message
));
return
message
;
},
...
...
@@ -1015,12 +1016,12 @@ converse.plugins.add('converse-chat', {
* @method _converse.ChatBox#sendChatState
*/
sendChatState
()
{
if
(
_converse
.
api
.
settings
.
get
(
'
send_chat_state_notifications
'
)
&&
this
.
get
(
'
chat_state
'
))
{
const
allowed
=
_converse
.
api
.
settings
.
get
(
'
send_chat_state_notifications
'
);
if
(
api
.
settings
.
get
(
'
send_chat_state_notifications
'
)
&&
this
.
get
(
'
chat_state
'
))
{
const
allowed
=
api
.
settings
.
get
(
'
send_chat_state_notifications
'
);
if
(
Array
.
isArray
(
allowed
)
&&
!
allowed
.
includes
(
this
.
get
(
'
chat_state
'
)))
{
return
;
}
_converse
.
api
.
send
(
api
.
send
(
$msg
({
'
id
'
:
u
.
getUniqueId
(),
'
to
'
:
this
.
get
(
'
jid
'
),
...
...
@@ -1034,7 +1035,7 @@ converse.plugins.add('converse-chat', {
async
sendFiles
(
files
)
{
const
result
=
await
_converse
.
api
.
disco
.
features
.
get
(
Strophe
.
NS
.
HTTPUPLOAD
,
_converse
.
domain
);
const
result
=
await
api
.
disco
.
features
.
get
(
Strophe
.
NS
.
HTTPUPLOAD
,
_converse
.
domain
);
const
item
=
result
.
pop
();
if
(
!
item
)
{
this
.
createMessage
({
...
...
@@ -1141,7 +1142,7 @@ converse.plugins.add('converse-chat', {
function
rejectMessage
(
stanza
,
text
)
{
// Reject an incoming message by replying with an error message of type "cancel".
_converse
.
api
.
send
(
api
.
send
(
$msg
({
'
to
'
:
stanza
.
getAttribute
(
'
from
'
),
'
type
'
:
'
error
'
,
...
...
@@ -1160,7 +1161,7 @@ converse.plugins.add('converse-chat', {
if
(
utils
.
isSameBareJID
(
from_jid
,
_converse
.
bare_jid
))
{
return
;
}
const
chatbox
=
await
_converse
.
api
.
chatboxes
.
get
(
from_jid
);
const
chatbox
=
await
api
.
chatboxes
.
get
(
from_jid
);
if
(
!
chatbox
)
{
return
;
}
...
...
@@ -1184,7 +1185,7 @@ converse.plugins.add('converse-chat', {
let
to_jid
=
stanza
.
getAttribute
(
'
to
'
);
const
to_resource
=
Strophe
.
getResourceFromJid
(
to_jid
);
if
(
_converse
.
api
.
settings
.
get
(
'
filter_by_resource
'
)
&&
(
to_resource
&&
to_resource
!==
_converse
.
resource
))
{
if
(
api
.
settings
.
get
(
'
filter_by_resource
'
)
&&
(
to_resource
&&
to_resource
!==
_converse
.
resource
))
{
return
log
.
info
(
`handleMessageStanza: Ignoring incoming message intended for a different resource:
${
to_jid
}
`
);
}
else
if
(
utils
.
isHeadlineMessage
(
_converse
,
stanza
))
{
// XXX: Prosody sends headline messages with the
...
...
@@ -1229,15 +1230,15 @@ converse.plugins.add('converse-chat', {
return
log
.
error
(
`Don't know how to handle message stanza without 'to' attribute.
${
stanza
.
outerHTML
}
`
);
}
const
contact_jid
=
is_me
?
Strophe
.
getBareJidFromJid
(
to_jid
)
:
from_bare_jid
;
const
contact
=
await
_converse
.
api
.
contacts
.
get
(
contact_jid
);
if
(
contact
===
undefined
&&
!
_converse
.
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
const
contact
=
await
api
.
contacts
.
get
(
contact_jid
);
if
(
contact
===
undefined
&&
!
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
log
.
error
(
`Blocking messaging with a JID not in our roster because allow_non_roster_messaging is false.`
);
return
log
.
error
(
stanza
);
}
// Get chat box, but only create when the message has something to show to the user
const
has_body
=
sizzle
(
`body, encrypted[xmlns="
${
Strophe
.
NS
.
OMEMO
}
"]`
,
stanza
).
length
>
0
;
const
roster_nick
=
contact
?.
attributes
?.
nickname
;
const
chatbox
=
await
_converse
.
api
.
chats
.
get
(
contact_jid
,
{
'
nickname
'
:
roster_nick
},
has_body
);
const
chatbox
=
await
api
.
chats
.
get
(
contact_jid
,
{
'
nickname
'
:
roster_nick
},
has_body
);
chatbox
&&
await
chatbox
.
queueMessage
(
stanza
,
original_stanza
,
from_jid
);
/**
* Triggered when a message stanza is been received and processed.
...
...
@@ -1247,7 +1248,7 @@ converse.plugins.add('converse-chat', {
* @property { XMLElement } stanza
* @example _converse.api.listen.on('message', obj => { ... });
*/
_converse
.
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
,
'
chatbox
'
:
chatbox
});
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
,
'
chatbox
'
:
chatbox
});
}
...
...
@@ -1287,12 +1288,12 @@ converse.plugins.add('converse-chat', {
function
autoJoinChats
()
{
// Automatically join private chats, based on the
// "auto_join_private_chats" configuration setting.
_converse
.
api
.
settings
.
get
(
'
auto_join_private_chats
'
).
forEach
(
jid
=>
{
api
.
settings
.
get
(
'
auto_join_private_chats
'
).
forEach
(
jid
=>
{
if
(
_converse
.
chatboxes
.
where
({
'
jid
'
:
jid
}).
length
)
{
return
;
}
if
(
isString
(
jid
))
{
_converse
.
api
.
chats
.
open
(
jid
);
api
.
chats
.
open
(
jid
);
}
else
{
log
.
error
(
'
Invalid jid criteria specified for "auto_join_private_chats"
'
);
}
...
...
@@ -1305,7 +1306,7 @@ converse.plugins.add('converse-chat', {
* @example _converse.api.listen.on('privateChatsAutoJoined', () => { ... });
* @example _converse.api.waitUntil('privateChatsAutoJoined').then(() => { ... });
*/
_converse
.
api
.
trigger
(
'
privateChatsAutoJoined
'
);
api
.
trigger
(
'
privateChatsAutoJoined
'
);
}
...
...
@@ -1314,17 +1315,17 @@ converse.plugins.add('converse-chat', {
if
(
!
utils
.
isValidJID
(
jid
))
{
return
log
.
warn
(
`Invalid JID "
${
jid
}
" provided in URL fragment`
);
}
_converse
.
api
.
chats
.
open
(
jid
);
api
.
chats
.
open
(
jid
);
}
_converse
.
router
.
route
(
'
converse/chat?jid=:jid
'
,
openChat
);
/************************ END Route Handlers ************************/
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
chatBoxesFetched
'
,
autoJoinChats
);
_converse
.
api
.
listen
.
on
(
'
presencesInitialized
'
,
registerMessageHandlers
);
api
.
listen
.
on
(
'
chatBoxesFetched
'
,
autoJoinChats
);
api
.
listen
.
on
(
'
presencesInitialized
'
,
registerMessageHandlers
);
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
if
(
_converse
.
shouldClearCache
())
{
return
Promise
.
all
(
_converse
.
chatboxes
.
map
(
c
=>
c
.
messages
&&
c
.
messages
.
clearStore
({
'
silent
'
:
true
})));
}
...
...
@@ -1333,26 +1334,26 @@ converse.plugins.add('converse-chat', {
/************************ BEGIN API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The "chats" namespace (used for one-on-one chats)
*
* @namespace
_converse.
api.chats
* @memberOf
_converse.
api
* @namespace api.chats
* @memberOf api
*/
chats
:
{
/**
* @method
_converse.
api.chats.create
* @method api.chats.create
* @param {string|string[]} jid|jids An jid or array of jids
* @param {object} [attrs] An object containing configuration attributes.
*/
async
create
(
jids
,
attrs
)
{
if
(
isString
(
jids
))
{
if
(
attrs
&&
!
attrs
?.
fullname
)
{
const
contact
=
await
_converse
.
api
.
contacts
.
get
(
jids
);
const
contact
=
await
api
.
contacts
.
get
(
jids
);
attrs
.
fullname
=
contact
?.
attributes
?.
fullname
;
}
const
chatbox
=
_converse
.
api
.
chats
.
get
(
jids
,
attrs
,
true
);
const
chatbox
=
api
.
chats
.
get
(
jids
,
attrs
,
true
);
if
(
!
chatbox
)
{
log
.
error
(
"
Could not open chatbox for JID:
"
+
jids
);
return
;
...
...
@@ -1361,9 +1362,9 @@ converse.plugins.add('converse-chat', {
}
if
(
Array
.
isArray
(
jids
))
{
return
Promise
.
all
(
jids
.
forEach
(
async
jid
=>
{
const
contact
=
await
_converse
.
api
.
contacts
.
get
(
jids
);
const
contact
=
await
api
.
contacts
.
get
(
jids
);
attrs
.
fullname
=
contact
?.
attributes
?.
fullname
;
return
_converse
.
api
.
chats
.
get
(
jid
,
attrs
,
true
).
maybeShow
();
return
api
.
chats
.
get
(
jid
,
attrs
,
true
).
maybeShow
();
}));
}
log
.
error
(
"
chats.create: You need to provide at least one JID
"
);
...
...
@@ -1373,7 +1374,7 @@ converse.plugins.add('converse-chat', {
/**
* Opens a new one-on-one chat.
*
* @method
_converse.
api.chats.open
* @method api.chats.open
* @param {String|string[]} name - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [attrs.minimized] - Should the chat be created in minimized state.
...
...
@@ -1392,7 +1393,7 @@ converse.plugins.add('converse-chat', {
* initialize: function() {
* const _converse = this._converse;
* // Note, buddy@example.org must be in your contacts roster!
*
_converse.
api.chats.open('buddy@example.com').then(chat => {
* api.chats.open('buddy@example.com').then(chat => {
* // Now you can do something with the chat model
* });
* }
...
...
@@ -1404,7 +1405,7 @@ converse.plugins.add('converse-chat', {
* initialize: function () {
* const _converse = this._converse;
* // Note, these users must first be in your contacts roster!
*
_converse.
api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => {
* api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => {
* // Now you can do something with the chat models
* });
* }
...
...
@@ -1412,14 +1413,14 @@ converse.plugins.add('converse-chat', {
*/
async
open
(
jids
,
attrs
,
force
)
{
if
(
isString
(
jids
))
{
const
chat
=
await
_converse
.
api
.
chats
.
get
(
jids
,
attrs
,
true
);
const
chat
=
await
api
.
chats
.
get
(
jids
,
attrs
,
true
);
if
(
chat
)
{
return
chat
.
maybeShow
(
force
);
}
return
chat
;
}
else
if
(
Array
.
isArray
(
jids
))
{
return
Promise
.
all
(
jids
.
map
(
j
=>
_converse
.
api
.
chats
.
get
(
j
,
attrs
,
true
).
then
(
c
=>
c
&&
c
.
maybeShow
(
force
)))
jids
.
map
(
j
=>
api
.
chats
.
get
(
j
,
attrs
,
true
).
then
(
c
=>
c
&&
c
.
maybeShow
(
force
)))
.
filter
(
c
=>
c
)
);
}
...
...
@@ -1431,7 +1432,7 @@ converse.plugins.add('converse-chat', {
/**
* Retrieves a chat or all chats.
*
* @method
_converse.
api.chats.get
* @method api.chats.get
* @param {String|string[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
...
...
@@ -1439,22 +1440,22 @@ converse.plugins.add('converse-chat', {
*
* @example
* // To return a single chat, provide the JID of the contact you're chatting with in that chat:
* const model = await
_converse.
api.chats.get('buddy@example.com');
* const model = await api.chats.get('buddy@example.com');
*
* @example
* // To return an array of chats, provide an array of JIDs:
* const models = await
_converse.
api.chats.get(['buddy1@example.com', 'buddy2@example.com']);
* const models = await api.chats.get(['buddy1@example.com', 'buddy2@example.com']);
*
* @example
* // To return all open chats, call the method without any parameters::
* const models = await
_converse.
api.chats.get();
* const models = await api.chats.get();
*
*/
async
get
(
jids
,
attrs
=
{},
create
=
false
)
{
async
function
_get
(
jid
)
{
let
model
=
await
_converse
.
api
.
chatboxes
.
get
(
jid
);
let
model
=
await
api
.
chatboxes
.
get
(
jid
);
if
(
!
model
&&
create
)
{
model
=
await
_converse
.
api
.
chatboxes
.
create
(
jid
,
attrs
,
_converse
.
ChatBox
);
model
=
await
api
.
chatboxes
.
create
(
jid
,
attrs
,
_converse
.
ChatBox
);
}
else
{
model
=
(
model
&&
model
.
get
(
'
type
'
)
===
_converse
.
PRIVATE_CHAT_TYPE
)
?
model
:
null
;
if
(
model
&&
Object
.
keys
(
attrs
).
length
)
{
...
...
@@ -1464,7 +1465,7 @@ converse.plugins.add('converse-chat', {
return
model
;
}
if
(
jids
===
undefined
)
{
const
chats
=
await
_converse
.
api
.
chatboxes
.
get
();
const
chats
=
await
api
.
chatboxes
.
get
();
return
chats
.
filter
(
c
=>
(
c
.
get
(
'
type
'
)
===
_converse
.
PRIVATE_CHAT_TYPE
));
}
else
if
(
isString
(
jids
))
{
return
_get
(
jids
);
...
...
src/headless/converse-chatboxes.js
View file @
030c26a8
...
...
@@ -26,8 +26,9 @@ converse.plugins.add('converse-chatboxes', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
promises
.
add
([
api
.
promises
.
add
([
'
chatBoxesFetched
'
,
'
chatBoxesInitialized
'
,
'
privateChatsAutoJoined
'
...
...
@@ -78,7 +79,7 @@ converse.plugins.add('converse-chatboxes', {
* @example _converse.api.listen.on('message', obj => { ... });
* @example _converse.api.waitUntil('chatBoxesFetched').then(() => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxesFetched
'
);
api
.
trigger
(
'
chatBoxesFetched
'
);
},
onConnected
(
reconnecting
)
{
...
...
@@ -114,13 +115,13 @@ converse.plugins.add('converse-chatboxes', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
{
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
MESSAGE_CORRECT
);
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
HTTPUPLOAD
);
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
OUTOFBAND
);
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
{
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
MESSAGE_CORRECT
);
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
HTTPUPLOAD
);
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
OUTOFBAND
);
});
_converse
.
api
.
listen
.
on
(
'
pluginsInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
pluginsInitialized
'
,
()
=>
{
_converse
.
chatboxes
=
new
_converse
.
ChatBoxes
();
/**
* Triggered once the _converse.ChatBoxes collection has been initialized.
...
...
@@ -128,32 +129,32 @@ converse.plugins.add('converse-chatboxes', {
* @example _converse.api.listen.on('chatBoxesInitialized', () => { ... });
* @example _converse.api.waitUntil('chatBoxesInitialized').then(() => { ... });
*/
_converse
.
api
.
trigger
(
'
chatBoxesInitialized
'
);
api
.
trigger
(
'
chatBoxesInitialized
'
);
});
_converse
.
api
.
listen
.
on
(
'
presencesInitialized
'
,
(
reconnecting
)
=>
_converse
.
chatboxes
.
onConnected
(
reconnecting
));
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
()
=>
_converse
.
chatboxes
.
forEach
(
m
=>
m
.
onReconnection
()));
_converse
.
api
.
listen
.
on
(
'
windowStateChanged
'
,
d
=>
(
d
.
state
===
'
visible
'
)
&&
_converse
.
clearMsgCounter
());
api
.
listen
.
on
(
'
presencesInitialized
'
,
(
reconnecting
)
=>
_converse
.
chatboxes
.
onConnected
(
reconnecting
));
api
.
listen
.
on
(
'
reconnected
'
,
()
=>
_converse
.
chatboxes
.
forEach
(
m
=>
m
.
onReconnection
()));
api
.
listen
.
on
(
'
windowStateChanged
'
,
d
=>
(
d
.
state
===
'
visible
'
)
&&
_converse
.
clearMsgCounter
());
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The "chatboxes" namespace.
*
* @namespace
_converse.
api.chatboxes
* @memberOf
_converse.
api
* @namespace api.chatboxes
* @memberOf api
*/
chatboxes
:
{
/**
* @method
_converse.
api.chats.create
* @method api.chats.create
* @param { String|String[] } jids - A JID or array of JIDs
* @param { Object } [attrs] An object containing configuration attributes
* @param { Model } model - The type of chatbox that should be created
*/
async
create
(
jids
=
[],
attrs
=
{},
model
)
{
await
_converse
.
api
.
waitUntil
(
'
chatBoxesFetched
'
);
await
api
.
waitUntil
(
'
chatBoxesFetched
'
);
if
(
isString
(
jids
))
{
return
createChatBox
(
jids
,
attrs
,
model
);
}
else
{
...
...
@@ -162,11 +163,11 @@ converse.plugins.add('converse-chatboxes', {
},
/**
* @method
_converse.
api.chats.get
* @method api.chats.get
* @param { String|String[] } jids - A JID or array of JIDs
*/
async
get
(
jids
)
{
await
_converse
.
api
.
waitUntil
(
'
chatBoxesFetched
'
);
await
api
.
waitUntil
(
'
chatBoxesFetched
'
);
if
(
jids
===
undefined
)
{
return
_converse
.
chatboxes
.
models
;
}
else
if
(
isString
(
jids
))
{
...
...
src/headless/converse-disco.js
View file @
030c26a8
...
...
@@ -20,10 +20,11 @@ converse.plugins.add('converse-disco', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
// Promises exposed by this plugin
_converse
.
api
.
promises
.
add
(
'
discoInitialized
'
);
_converse
.
api
.
promises
.
add
(
'
streamFeaturesAdded
'
);
api
.
promises
.
add
(
'
discoInitialized
'
);
api
.
promises
.
add
(
'
streamFeaturesAdded
'
);
/**
...
...
@@ -106,7 +107,7 @@ converse.plugins.add('converse-disco', {
* @type { Model }
* @example _converse.api.listen.on('featuresDiscovered', feature => { ... });
*/
_converse
.
api
.
trigger
(
'
serviceDiscovered
'
,
feature
);
api
.
trigger
(
'
serviceDiscovered
'
,
feature
);
},
onFieldAdded
(
field
)
{
...
...
@@ -117,7 +118,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#discoExtensionFieldDiscovered
* @example _converse.api.listen.on('discoExtensionFieldDiscovered', () => { ... });
*/
_converse
.
api
.
trigger
(
'
discoExtensionFieldDiscovered
'
,
field
);
api
.
trigger
(
'
discoExtensionFieldDiscovered
'
,
field
);
},
async
fetchFeatures
(
options
)
{
...
...
@@ -144,7 +145,7 @@ converse.plugins.add('converse-disco', {
async
queryInfo
()
{
let
stanza
;
try
{
stanza
=
await
_converse
.
api
.
disco
.
info
(
this
.
get
(
'
jid
'
),
null
);
stanza
=
await
api
.
disco
.
info
(
this
.
get
(
'
jid
'
),
null
);
}
catch
(
iq
)
{
log
.
error
(
iq
);
this
.
waitUntilFeaturesDiscovered
.
resolve
(
this
);
...
...
@@ -178,7 +179,7 @@ converse.plugins.add('converse-disco', {
// server or a conference component.
return
;
}
const
stanza
=
await
_converse
.
api
.
disco
.
items
(
this
.
get
(
'
jid
'
));
const
stanza
=
await
api
.
disco
.
items
(
this
.
get
(
'
jid
'
));
this
.
onDiscoItems
(
stanza
);
},
...
...
@@ -246,13 +247,13 @@ converse.plugins.add('converse-disco', {
function
addClientFeatures
()
{
// See https://xmpp.org/registrar/disco-categories.html
_converse
.
api
.
disco
.
own
.
identities
.
add
(
'
client
'
,
'
web
'
,
'
Converse
'
);
api
.
disco
.
own
.
identities
.
add
(
'
client
'
,
'
web
'
,
'
Converse
'
);
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
CHATSTATES
);
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
DISCO_INFO
);
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
ROSTERX
);
// Limited support
if
(
_converse
.
api
.
settings
.
get
(
"
message_carbons
"
))
{
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
CARBONS
);
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
CHATSTATES
);
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
DISCO_INFO
);
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
ROSTERX
);
// Limited support
if
(
api
.
settings
.
get
(
"
message_carbons
"
))
{
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
CARBONS
);
}
/**
* Triggered in converse-disco once the core disco features of
...
...
@@ -260,7 +261,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#addClientFeatures
* @example _converse.api.listen.on('addClientFeatures', () => { ... });
*/
_converse
.
api
.
trigger
(
'
addClientFeatures
'
);
api
.
trigger
(
'
addClientFeatures
'
);
return
this
;
}
...
...
@@ -274,7 +275,7 @@ converse.plugins.add('converse-disco', {
if
(
!
_converse
.
stream_features
)
{
const
bare_jid
=
Strophe
.
getBareJidFromJid
(
_converse
.
jid
);
const
id
=
`converse.stream-features-
${
bare_jid
}
`
;
_converse
.
api
.
promises
.
add
(
'
streamFeaturesAdded
'
);
api
.
promises
.
add
(
'
streamFeaturesAdded
'
);
_converse
.
stream_features
=
new
Collection
();
_converse
.
stream_features
.
browserStorage
=
_converse
.
createStore
(
id
,
"
session
"
);
}
...
...
@@ -306,7 +307,7 @@ converse.plugins.add('converse-disco', {
* @event _converse#streamFeaturesAdded
* @example _converse.api.listen.on('streamFeaturesAdded', () => { ... });
*/
_converse
.
api
.
trigger
(
'
streamFeaturesAdded
'
);
api
.
trigger
(
'
streamFeaturesAdded
'
);
}
...
...
@@ -339,7 +340,7 @@ converse.plugins.add('converse-disco', {
iqresult
.
c
(
'
identity
'
,
attrs
).
up
();
});
plugin
.
_features
.
forEach
(
feature
=>
iqresult
.
c
(
'
feature
'
,
{
'
var
'
:
feature
}).
up
());
_converse
.
api
.
send
(
iqresult
.
tree
());
api
.
send
(
iqresult
.
tree
());
return
true
;
}
...
...
@@ -364,12 +365,12 @@ converse.plugins.add('converse-disco', {
* @event _converse#discoInitialized
* @example _converse.api.listen.on('discoInitialized', () => { ... });
*/
_converse
.
api
.
trigger
(
'
discoInitialized
'
);
api
.
trigger
(
'
discoInitialized
'
);
}
/******************** Event Handlers ********************/
_converse
.
api
.
listen
.
on
(
'
userSessionInitialized
'
,
async
()
=>
{
api
.
listen
.
on
(
'
userSessionInitialized
'
,
async
()
=>
{
initStreamFeatures
();
if
(
_converse
.
connfeedback
.
get
(
'
connection_status
'
)
===
Strophe
.
Status
.
ATTACHED
)
{
// When re-attaching to a BOSH session, we fetch the stream features from the cache.
...
...
@@ -377,20 +378,20 @@ converse.plugins.add('converse-disco', {
notifyStreamFeaturesAdded
();
}
});
_converse
.
api
.
listen
.
on
(
'
beforeResourceBinding
'
,
populateStreamFeatures
);
api
.
listen
.
on
(
'
beforeResourceBinding
'
,
populateStreamFeatures
);
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
initializeDisco
);
_converse
.
api
.
listen
.
on
(
'
connected
'
,
initializeDisco
);
api
.
listen
.
on
(
'
reconnected
'
,
initializeDisco
);
api
.
listen
.
on
(
'
connected
'
,
initializeDisco
);
_converse
.
api
.
listen
.
on
(
'
beforeTearDown
'
,
async
()
=>
{
_converse
.
api
.
promises
.
add
(
'
streamFeaturesAdded
'
)
api
.
listen
.
on
(
'
beforeTearDown
'
,
async
()
=>
{
api
.
promises
.
add
(
'
streamFeaturesAdded
'
)
if
(
_converse
.
stream_features
)
{
await
_converse
.
stream_features
.
clearStore
();
delete
_converse
.
stream_features
;
}
});
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
if
(
_converse
.
shouldClearCache
()
&&
_converse
.
disco_entities
)
{
Array
.
from
(
_converse
.
disco_entities
.
models
).
forEach
(
e
=>
e
.
features
.
clearStore
());
Array
.
from
(
_converse
.
disco_entities
.
models
).
forEach
(
e
=>
e
.
identities
.
clearStore
());
...
...
@@ -404,34 +405,34 @@ converse.plugins.add('converse-disco', {
/************************ API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The XEP-0030 service discovery API
*
* This API lets you discover information about entities on the
* XMPP network.
*
* @namespace
_converse.
api.disco
* @memberOf
_converse.
api
* @namespace api.disco
* @memberOf api
*/
disco
:
{
/**
* @namespace
_converse.
api.disco.stream
* @memberOf
_converse.
api.disco
* @namespace api.disco.stream
* @memberOf api.disco
*/
stream
:
{
/**
* @method
_converse.
api.disco.stream.getFeature
* @method api.disco.stream.getFeature
* @param {String} name The feature name
* @param {String} xmlns The XML namespace
* @example _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver')
*/
async
getFeature
(
name
,
xmlns
)
{
await
_converse
.
api
.
waitUntil
(
'
streamFeaturesAdded
'
);
await
api
.
waitUntil
(
'
streamFeaturesAdded
'
);
if
(
!
name
||
!
xmlns
)
{
throw
new
Error
(
"
name and xmlns need to be provided when calling disco.stream.getFeature
"
);
}
if
(
_converse
.
stream_features
===
undefined
&&
!
_converse
.
api
.
connection
.
connected
())
{
if
(
_converse
.
stream_features
===
undefined
&&
!
api
.
connection
.
connected
())
{
// Happens during tests when disco lookups happen asynchronously after teardown.
const
msg
=
`Tried to get feature
${
name
}
${
xmlns
}
but _converse.stream_features has been torn down`
;
log
.
warn
(
msg
);
...
...
@@ -442,18 +443,18 @@ converse.plugins.add('converse-disco', {
},
/**
* @namespace
_converse.
api.disco.own
* @memberOf
_converse.
api.disco
* @namespace api.disco.own
* @memberOf api.disco
*/
own
:
{
/**
* @namespace
_converse.
api.disco.own.identities
* @memberOf
_converse.
api.disco.own
* @namespace api.disco.own.identities
* @memberOf api.disco.own
*/
identities
:
{
/**
* Lets you add new identities for this client (i.e. instance of Converse)
* @method
_converse.
api.disco.own.identities.add
* @method api.disco.own.identities.add
*
* @param {String} category - server, client, gateway, directory, etc.
* @param {String} type - phone, pc, web, etc.
...
...
@@ -475,7 +476,7 @@ converse.plugins.add('converse-disco', {
},
/**
* Clears all previously registered identities.
* @method
_converse.
api.disco.own.identities.clear
* @method api.disco.own.identities.clear
* @example _converse.api.disco.own.identities.clear();
*/
clear
()
{
...
...
@@ -484,8 +485,8 @@ converse.plugins.add('converse-disco', {
/**
* Returns all of the identities registered for this client
* (i.e. instance of Converse).
* @method
_converse.
api.disco.identities.get
* @example const identities =
_converse.
api.disco.own.identities.get();
* @method api.disco.identities.get
* @example const identities = api.disco.own.identities.get();
*/
get
()
{
return
plugin
.
_identities
;
...
...
@@ -493,13 +494,13 @@ converse.plugins.add('converse-disco', {
},
/**
* @namespace
_converse.
api.disco.own.features
* @memberOf
_converse.
api.disco.own
* @namespace api.disco.own.features
* @memberOf api.disco.own
*/
features
:
{
/**
* Lets you register new disco features for this client (i.e. instance of Converse)
* @method
_converse.
api.disco.own.features.add
* @method api.disco.own.features.add
* @param {String} name - e.g. http://jabber.org/protocol/caps
* @example _converse.api.disco.own.features.add("http://jabber.org/protocol/caps");
*/
...
...
@@ -511,7 +512,7 @@ converse.plugins.add('converse-disco', {
},
/**
* Clears all previously registered features.
* @method
_converse.
api.disco.own.features.clear
* @method api.disco.own.features.clear
* @example _converse.api.disco.own.features.clear();
*/
clear
()
{
...
...
@@ -519,8 +520,8 @@ converse.plugins.add('converse-disco', {
},
/**
* Returns all of the features registered for this client (i.e. instance of Converse).
* @method
_converse.
api.disco.own.features.get
* @example const features =
_converse.
api.disco.own.features.get();
* @method api.disco.own.features.get
* @example const features = api.disco.own.features.get();
*/
get
()
{
return
plugin
.
_features
;
...
...
@@ -531,7 +532,7 @@ converse.plugins.add('converse-disco', {
/**
* Query for information about an XMPP entity
*
* @method
_converse.
api.disco.info
* @method api.disco.info
* @param {string} jid The Jabber ID of the entity to query
* @param {string} [node] A specific node identifier associated with the JID
* @returns {promise} Promise which resolves once we have a result from the server.
...
...
@@ -546,13 +547,13 @@ converse.plugins.add('converse-disco', {
'
to
'
:
jid
,
'
type
'
:
'
get
'
}).
c
(
'
query
'
,
attrs
);
return
_converse
.
api
.
sendIQ
(
info
);
return
api
.
sendIQ
(
info
);
},
/**
* Query for items associated with an XMPP entity
*
* @method
_converse.
api.disco.items
* @method api.disco.items
* @param {string} jid The Jabber ID of the entity to query for items
* @param {string} [node] A specific node identifier associated with the JID
* @returns {promise} Promise which resolves once we have a result from the server.
...
...
@@ -562,7 +563,7 @@ converse.plugins.add('converse-disco', {
if
(
node
)
{
attrs
.
node
=
node
;
}
return
_converse
.
api
.
sendIQ
(
return
api
.
sendIQ
(
$iq
({
'
from
'
:
_converse
.
connection
.
jid
,
'
to
'
:
jid
,
...
...
@@ -574,24 +575,24 @@ converse.plugins.add('converse-disco', {
/**
* Namespace for methods associated with disco entities
*
* @namespace
_converse.
api.disco.entities
* @memberOf
_converse.
api.disco
* @namespace api.disco.entities
* @memberOf api.disco
*/
entities
:
{
/**
* Get the corresponding `DiscoEntity` instance.
*
* @method
_converse.
api.disco.entities.get
* @method api.disco.entities.get
* @param {string} jid The Jabber ID of the entity
* @param {boolean} [create] Whether the entity should be created if it doesn't exist.
* @example _converse.api.disco.entities.get(jid);
*/
async
get
(
jid
,
create
=
false
)
{
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
await
api
.
waitUntil
(
'
discoInitialized
'
);
if
(
!
jid
)
{
return
_converse
.
disco_entities
;
}
if
(
_converse
.
disco_entities
===
undefined
&&
!
_converse
.
api
.
connection
.
connected
())
{
if
(
_converse
.
disco_entities
===
undefined
&&
!
api
.
connection
.
connected
())
{
// Happens during tests when disco lookups happen asynchronously after teardown.
const
msg
=
`Tried to look up entity
${
jid
}
but _converse.disco_entities has been torn down`
;
log
.
warn
(
msg
);
...
...
@@ -601,7 +602,7 @@ converse.plugins.add('converse-disco', {
if
(
entity
||
!
create
)
{
return
entity
;
}
return
_converse
.
api
.
disco
.
entities
.
create
(
jid
);
return
api
.
disco
.
entities
.
create
(
jid
);
},
/**
...
...
@@ -612,7 +613,7 @@ converse.plugins.add('converse-disco', {
* Fetching from cache can be disabled by passing in
* `ignore_cache: true` in the options parameter.
*
* @method
_converse.
api.disco.entities.create
* @method api.disco.entities.create
* @param {string} jid The Jabber ID of the entity
* @param {object} [options] Additional options
* @param {boolean} [options.ignore_cache]
...
...
@@ -625,14 +626,14 @@ converse.plugins.add('converse-disco', {
},
/**
* @namespace
_converse.
api.disco.features
* @memberOf
_converse.
api.disco
* @namespace api.disco.features
* @memberOf api.disco
*/
features
:
{
/**
* Return a given feature of a disco entity
*
* @method
_converse.
api.disco.features.get
* @method api.disco.features.get
* @param {string} feature The feature that might be
* supported. In the XML stanza, this is the `var`
* attribute of the `<feature>` element. For
...
...
@@ -644,16 +645,16 @@ converse.plugins.add('converse-disco', {
* itself or those items associated with the entity if
* they support the given feature.
* @example
*
_converse.
api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid);
* api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid);
*/
async
get
(
feature
,
jid
)
{
if
(
!
jid
)
{
throw
new
TypeError
(
'
You need to provide an entity JID
'
);
}
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
await
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
api
.
disco
.
entities
.
get
(
jid
,
true
);
if
(
_converse
.
disco_entities
===
undefined
&&
!
_converse
.
api
.
connection
.
connected
())
{
if
(
_converse
.
disco_entities
===
undefined
&&
!
api
.
connection
.
connected
())
{
// Happens during tests when disco lookups happen asynchronously after teardown.
const
msg
=
`Tried to get feature
${
feature
}
for
${
jid
}
but _converse.disco_entities has been torn down`
;
log
.
warn
(
msg
);
...
...
@@ -669,7 +670,7 @@ converse.plugins.add('converse-disco', {
/**
* Used to determine whether an entity supports a given feature.
*
* @method
_converse.
api.disco.supports
* @method api.disco.supports
* @param {string} feature The feature that might be
* supported. In the XML stanza, this is the `var`
* attribute of the `<feature>` element. For
...
...
@@ -678,32 +679,32 @@ converse.plugins.add('converse-disco', {
* (and its associated items) which should be queried
* @returns {promise} A promise which resolves with `true` or `false`.
* @example
* if (await
_converse.
api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) {
* if (await api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) {
* // The feature is supported
* } else {
* // The feature is not supported
* }
*/
async
supports
(
feature
,
jid
)
{
const
features
=
await
_converse
.
api
.
disco
.
features
.
get
(
feature
,
jid
);
const
features
=
await
api
.
disco
.
features
.
get
(
feature
,
jid
);
return
features
.
length
>
0
;
},
/**
* Refresh the features, fields and identities associated with a
* disco entity by refetching them from the server
* @method
_converse.
api.disco.refresh
* @method api.disco.refresh
* @param {string} jid The JID of the entity whose features are refreshed.
* @returns {promise} A promise which resolves once the features have been refreshed
* @example
* await
_converse.
api.disco.refresh('room@conference.example.org');
* await api.disco.refresh('room@conference.example.org');
*/
async
refresh
(
jid
)
{
if
(
!
jid
)
{
throw
new
TypeError
(
'
api.disco.refresh: You need to provide an entity JID
'
);
}
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
);
await
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
api
.
disco
.
entities
.
get
(
jid
);
if
(
entity
)
{
entity
.
features
.
reset
();
entity
.
fields
.
reset
();
...
...
@@ -714,34 +715,34 @@ converse.plugins.add('converse-disco', {
entity
.
queryInfo
();
}
else
{
// Create it if it doesn't exist
entity
=
await
_converse
.
api
.
disco
.
entities
.
create
(
jid
,
{
'
ignore_cache
'
:
true
});
entity
=
await
api
.
disco
.
entities
.
create
(
jid
,
{
'
ignore_cache
'
:
true
});
}
return
entity
.
waitUntilFeaturesDiscovered
;
},
/**
* @deprecated Use {@link
_converse.
api.disco.refresh} instead.
* @method
_converse.
api.disco.refreshFeatures
* @deprecated Use {@link api.disco.refresh} instead.
* @method api.disco.refreshFeatures
*/
refreshFeatures
(
jid
)
{
return
_converse
.
api
.
refresh
(
jid
);
return
api
.
refresh
(
jid
);
},
/**
* Return all the features associated with a disco entity
*
* @method
_converse.
api.disco.getFeatures
* @method api.disco.getFeatures
* @param {string} jid The JID of the entity whose features are returned.
* @returns {promise} A promise which resolves with the returned features
* @example
* const features = await
_converse.
api.disco.getFeatures('room@conference.example.org');
* const features = await api.disco.getFeatures('room@conference.example.org');
*/
async
getFeatures
(
jid
)
{
if
(
!
jid
)
{
throw
new
TypeError
(
'
api.disco.getFeatures: You need to provide an entity JID
'
);
}
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
await
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
api
.
disco
.
entities
.
get
(
jid
,
true
);
entity
=
await
entity
.
waitUntilFeaturesDiscovered
;
return
entity
.
features
;
},
...
...
@@ -752,17 +753,17 @@ converse.plugins.add('converse-disco', {
*
* See [XEP-0129: Service Discovery Extensions](https://xmpp.org/extensions/xep-0128.html)
*
* @method
_converse.
api.disco.getFields
* @method api.disco.getFields
* @param {string} jid The JID of the entity whose fields are returned.
* @example
* const fields = await
_converse.
api.disco.getFields('room@conference.example.org');
* const fields = await api.disco.getFields('room@conference.example.org');
*/
async
getFields
(
jid
)
{
if
(
!
jid
)
{
throw
new
TypeError
(
'
api.disco.getFields: You need to provide an entity JID
'
);
}
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
await
api
.
waitUntil
(
'
discoInitialized
'
);
let
entity
=
await
api
.
disco
.
entities
.
get
(
jid
,
true
);
entity
=
await
entity
.
waitUntilFeaturesDiscovered
;
return
entity
.
fields
;
},
...
...
@@ -775,7 +776,7 @@ converse.plugins.add('converse-disco', {
* `category='pubsub'` and `type='pep'` as explained in this section of
* XEP-0163: https://xmpp.org/extensions/xep-0163.html#support
*
* @method
_converse.
api.disco.getIdentity
* @method api.disco.getIdentity
* @param {string} The identity category.
* In the XML stanza, this is the `category`
* attribute of the `<identity>` element.
...
...
@@ -788,7 +789,7 @@ converse.plugins.add('converse-disco', {
* @returns {promise} A promise which resolves with a map indicating
* whether an identity with a given type is provided by the entity.
* @example
*
_converse.
api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then(
* api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then(
* function (identity) {
* if (identity) {
* // The entity DOES have this identity
...
...
@@ -799,8 +800,8 @@ converse.plugins.add('converse-disco', {
* ).catch(e => log.error(e));
*/
async
getIdentity
(
category
,
type
,
jid
)
{
const
e
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
if
(
e
===
undefined
&&
!
_converse
.
api
.
connection
.
connected
())
{
const
e
=
await
api
.
disco
.
entities
.
get
(
jid
,
true
);
if
(
e
===
undefined
&&
!
api
.
connection
.
connected
())
{
// Happens during tests when disco lookups happen asynchronously after teardown.
const
msg
=
`Tried to look up category
${
category
}
for
${
jid
}
but _converse.disco_entities has been torn down`
;
log
.
warn
(
msg
);
...
...
src/headless/converse-emoji.js
View file @
030c26a8
...
...
@@ -61,9 +61,10 @@ converse.plugins.add('converse-emoji', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
___
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
emoji_image_path
'
:
twemoji
.
default
.
base
,
'
emoji_categories
'
:
{
"
smileys
"
:
"
:grinning:
"
,
...
...
@@ -98,8 +99,8 @@ converse.plugins.add('converse-emoji', {
});
_converse
.
emojis
=
{};
_converse
.
api
.
promises
.
add
(
'
emojisInitialized
'
,
false
);
twemoji
.
default
.
base
=
_converse
.
api
.
settings
.
get
(
'
emoji_image_path
'
);
api
.
promises
.
add
(
'
emojisInitialized
'
,
false
);
twemoji
.
default
.
base
=
api
.
settings
.
get
(
'
emoji_image_path
'
);
/**
...
...
@@ -162,7 +163,7 @@ converse.plugins.add('converse-emoji', {
}
};
const
transform
=
u
.
shortnamesToEmojis
;
return
_converse
.
api
.
settings
.
get
(
'
use_system_emojis
'
)
?
transform
:
text
=>
twemoji
.
default
.
parse
(
transform
(
text
),
how
);
return
api
.
settings
.
get
(
'
use_system_emojis
'
)
?
transform
:
text
=>
twemoji
.
default
.
parse
(
transform
(
text
),
how
);
},
/**
...
...
@@ -263,18 +264,18 @@ converse.plugins.add('converse-emoji', {
/************************ BEGIN API ************************/
// We extend the default converse.js API to add methods specific to MUC groupchats.
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The "rooms" namespace groups methods relevant to chatrooms
* (aka groupchats).
*
* @namespace
_converse.
api.rooms
* @memberOf
_converse.
api
* @namespace api.rooms
* @memberOf api
*/
emojis
:
{
/**
* Initializes Emoji support by downloading the emojis JSON (and any applicable images).
* @method
_converse.
api.emojis.initialize
* @method api.emojis.initialize
* @returns {Promise}
*/
async
initialize
()
{
...
...
@@ -300,7 +301,7 @@ converse.plugins.add('converse-emoji', {
* fetched and its save to start calling emoji utility methods.
* @event _converse#emojisInitialized
*/
_converse
.
api
.
trigger
(
'
emojisInitialized
'
);
api
.
trigger
(
'
emojisInitialized
'
);
}
}
});
...
...
src/headless/converse-headlines.js
View file @
030c26a8
...
...
@@ -47,6 +47,7 @@ converse.plugins.add('converse-headlines', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
/**
* Shows headline messages
...
...
@@ -58,7 +59,7 @@ converse.plugins.add('converse-headlines', {
defaults
()
{
return
{
'
bookmarked
'
:
false
,
'
hidden
'
:
[
'
mobile
'
,
'
fullscreen
'
].
includes
(
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)),
'
hidden
'
:
[
'
mobile
'
,
'
fullscreen
'
].
includes
(
api
.
settings
.
get
(
"
view_mode
"
)),
'
message_type
'
:
'
headline
'
,
'
num_unread
'
:
0
,
'
time_opened
'
:
this
.
get
(
'
time_opened
'
)
||
(
new
Date
()).
getTime
(),
...
...
@@ -75,7 +76,7 @@ converse.plugins.add('converse-headlines', {
* @type { _converse.HeadlinesBox }
* @example _converse.api.listen.on('headlinesBoxInitialized', model => { ... });
*/
_converse
.
api
.
trigger
(
'
headlinesBoxInitialized
'
,
this
);
api
.
trigger
(
'
headlinesBoxInitialized
'
,
this
);
}
});
...
...
@@ -85,7 +86,7 @@ converse.plugins.add('converse-headlines', {
const
from_jid
=
message
.
getAttribute
(
'
from
'
);
if
(
from_jid
.
includes
(
'
@
'
)
&&
!
_converse
.
roster
.
get
(
from_jid
)
&&
!
_converse
.
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
!
api
.
settings
.
get
(
"
allow_non_roster_messaging
"
))
{
return
;
}
if
(
message
.
querySelector
(
'
body
'
)
===
null
)
{
...
...
@@ -100,7 +101,7 @@ converse.plugins.add('converse-headlines', {
});
const
attrs
=
await
chatbox
.
getMessageAttributesFromStanza
(
message
,
message
);
await
chatbox
.
createMessage
(
attrs
);
_converse
.
api
.
trigger
(
'
message
'
,
{
'
chatbox
'
:
chatbox
,
'
stanza
'
:
message
});
api
.
trigger
(
'
message
'
,
{
'
chatbox
'
:
chatbox
,
'
stanza
'
:
message
});
}
}
...
...
@@ -112,26 +113,26 @@ converse.plugins.add('converse-headlines', {
return
true
},
null
,
'
message
'
);
}
_converse
.
api
.
listen
.
on
(
'
connected
'
,
registerHeadlineHandler
);
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
registerHeadlineHandler
);
api
.
listen
.
on
(
'
connected
'
,
registerHeadlineHandler
);
api
.
listen
.
on
(
'
reconnected
'
,
registerHeadlineHandler
);
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The "headlines" namespace, which is used for headline-channels
* which are read-only channels containing messages of type
* "headline".
*
* @namespace
_converse.
api.headlines
* @memberOf
_converse.
api
* @namespace api.headlines
* @memberOf api
*/
headlines
:
{
/**
* Retrieves a headline-channel or all headline-channels.
*
* @method
_converse.
api.headlines.get
* @method api.headlines.get
* @param {String|String[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
* @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
* @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
...
...
@@ -139,9 +140,9 @@ converse.plugins.add('converse-headlines', {
*/
async
get
(
jids
,
attrs
=
{},
create
=
false
)
{
async
function
_get
(
jid
)
{
let
model
=
await
_converse
.
api
.
chatboxes
.
get
(
jid
);
let
model
=
await
api
.
chatboxes
.
get
(
jid
);
if
(
!
model
&&
create
)
{
model
=
await
_converse
.
api
.
chatboxes
.
create
(
jid
,
attrs
,
_converse
.
HeadlinesBox
);
model
=
await
api
.
chatboxes
.
create
(
jid
,
attrs
,
_converse
.
HeadlinesBox
);
}
else
{
model
=
(
model
&&
model
.
get
(
'
type
'
)
===
_converse
.
HEADLINES_TYPE
)
?
model
:
null
;
if
(
model
&&
Object
.
keys
(
attrs
).
length
)
{
...
...
@@ -151,7 +152,7 @@ converse.plugins.add('converse-headlines', {
return
model
;
}
if
(
jids
===
undefined
)
{
const
chats
=
await
_converse
.
api
.
chatboxes
.
get
();
const
chats
=
await
api
.
chatboxes
.
get
();
return
chats
.
filter
(
c
=>
(
c
.
get
(
'
type
'
)
===
_converse
.
HEADLINES_TYPE
));
}
else
if
(
isString
(
jids
))
{
return
_get
(
jids
);
...
...
src/headless/converse-mam.js
View file @
030c26a8
...
...
@@ -28,8 +28,9 @@ converse.plugins.add('converse-mam', {
* loaded by Converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
archived_messages_page_size
:
'
50
'
,
message_archiving
:
undefined
,
// Supported values are 'always', 'never', 'roster' (https://xmpp.org/extensions/xep-0313.html#prefs)
message_archiving_timeout
:
20000
,
// Time (in milliseconds) to wait before aborting MAM request
...
...
@@ -85,18 +86,18 @@ converse.plugins.add('converse-mam', {
}
const
is_groupchat
=
this
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
;
const
mam_jid
=
is_groupchat
?
this
.
get
(
'
jid
'
)
:
_converse
.
bare_jid
;
if
(
!
(
await
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
MAM
,
mam_jid
)))
{
if
(
!
(
await
api
.
disco
.
supports
(
Strophe
.
NS
.
MAM
,
mam_jid
)))
{
return
;
}
const
msg_handler
=
is_groupchat
?
s
=>
this
.
queueMessage
(
s
)
:
s
=>
_converse
.
handleMessageStanza
(
s
);
const
query
=
Object
.
assign
({
'
groupchat
'
:
is_groupchat
,
'
max
'
:
_converse
.
api
.
settings
.
get
(
'
archived_messages_page_size
'
),
'
max
'
:
api
.
settings
.
get
(
'
archived_messages_page_size
'
),
'
with
'
:
this
.
get
(
'
jid
'
),
},
options
);
const
result
=
await
_converse
.
api
.
archive
.
query
(
query
);
const
result
=
await
api
.
archive
.
query
(
query
);
/* eslint-disable no-await-in-loop */
for
(
const
message
of
result
.
messages
)
{
try
{
...
...
@@ -113,9 +114,9 @@ converse.plugins.add('converse-mam', {
if
(
page
&&
result
.
rsm
)
{
if
(
page
===
'
forwards
'
)
{
options
=
result
.
rsm
.
next
(
_converse
.
api
.
settings
.
get
(
'
archived_messages_page_size
'
),
options
.
before
);
options
=
result
.
rsm
.
next
(
api
.
settings
.
get
(
'
archived_messages_page_size
'
),
options
.
before
);
}
else
if
(
page
===
'
backwards
'
)
{
options
=
result
.
rsm
.
previous
(
_converse
.
api
.
settings
.
get
(
'
archived_messages_page_size
'
),
options
.
after
);
options
=
result
.
rsm
.
previous
(
api
.
settings
.
get
(
'
archived_messages_page_size
'
),
options
.
after
);
}
return
this
.
fetchArchivedMessages
(
options
,
page
);
}
else
{
...
...
@@ -150,32 +151,32 @@ converse.plugins.add('converse-mam', {
*/
const
preference
=
sizzle
(
`prefs[xmlns="
${
Strophe
.
NS
.
MAM
}
"]`
,
iq
).
pop
();
const
default_pref
=
preference
.
getAttribute
(
'
default
'
);
if
(
default_pref
!==
_converse
.
api
.
settings
.
get
(
'
message_archiving
'
))
{
if
(
default_pref
!==
api
.
settings
.
get
(
'
message_archiving
'
))
{
const
stanza
=
$iq
({
'
type
'
:
'
set
'
})
.
c
(
'
prefs
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
MAM
,
'
default
'
:
_converse
.
api
.
settings
.
get
(
'
message_archiving
'
)
'
default
'
:
api
.
settings
.
get
(
'
message_archiving
'
)
});
Array
.
from
(
preference
.
children
).
forEach
(
child
=>
stanza
.
cnode
(
child
).
up
());
// XXX: Strictly speaking, the server should respond with the updated prefs
// (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
// but Prosody doesn't do this, so we don't rely on it.
_converse
.
api
.
sendIQ
(
stanza
)
.
then
(()
=>
feature
.
save
({
'
preferences
'
:
{
'
default
'
:
_converse
.
api
.
settings
.
get
(
'
message_archiving
'
)}}))
api
.
sendIQ
(
stanza
)
.
then
(()
=>
feature
.
save
({
'
preferences
'
:
{
'
default
'
:
api
.
settings
.
get
(
'
message_archiving
'
)}}))
.
catch
(
_converse
.
onMAMError
);
}
else
{
feature
.
save
({
'
preferences
'
:
{
'
default
'
:
_converse
.
api
.
settings
.
get
(
'
message_archiving
'
)}});
feature
.
save
({
'
preferences
'
:
{
'
default
'
:
api
.
settings
.
get
(
'
message_archiving
'
)}});
}
};
function
getMAMPrefsFromFeature
(
feature
)
{
const
prefs
=
feature
.
get
(
'
preferences
'
)
||
{};
if
(
feature
.
get
(
'
var
'
)
!==
Strophe
.
NS
.
MAM
||
_converse
.
api
.
settings
.
get
(
'
message_archiving
'
)
===
undefined
)
{
if
(
feature
.
get
(
'
var
'
)
!==
Strophe
.
NS
.
MAM
||
api
.
settings
.
get
(
'
message_archiving
'
)
===
undefined
)
{
return
;
}
if
(
prefs
[
'
default
'
]
!==
_converse
.
api
.
settings
.
get
(
'
message_archiving
'
))
{
_converse
.
api
.
sendIQ
(
$iq
({
'
type
'
:
'
get
'
}).
c
(
'
prefs
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
MAM
}))
if
(
prefs
[
'
default
'
]
!==
api
.
settings
.
get
(
'
message_archiving
'
))
{
api
.
sendIQ
(
$iq
({
'
type
'
:
'
get
'
}).
c
(
'
prefs
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
MAM
}))
.
then
(
iq
=>
_converse
.
onMAMPreferences
(
iq
,
feature
))
.
catch
(
_converse
.
onMAMError
);
}
...
...
@@ -193,26 +194,26 @@ converse.plugins.add('converse-mam', {
}
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
MAM
));
_converse
.
api
.
listen
.
on
(
'
serviceDiscovered
'
,
getMAMPrefsFromFeature
);
_converse
.
api
.
listen
.
on
(
'
chatRoomViewInitialized
'
,
view
=>
{
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
MAM
));
api
.
listen
.
on
(
'
serviceDiscovered
'
,
getMAMPrefsFromFeature
);
api
.
listen
.
on
(
'
chatRoomViewInitialized
'
,
view
=>
{
if
(
_converse
.
muc_show_logs_before_join
)
{
// If we want to show MAM logs before entering the MUC, we need
// to be informed once it's clear that this MUC supports MAM.
view
.
model
.
features
.
on
(
'
change:mam_enabled
'
,
preMUCJoinMAMFetch
(
view
.
model
));
}
});
_converse
.
api
.
listen
.
on
(
'
enteredNewRoom
'
,
room
=>
room
.
features
.
get
(
'
mam_enabled
'
)
&&
room
.
fetchNewestMessages
());
api
.
listen
.
on
(
'
enteredNewRoom
'
,
room
=>
room
.
features
.
get
(
'
mam_enabled
'
)
&&
room
.
fetchNewestMessages
());
_converse
.
api
.
listen
.
on
(
'
chatReconnected
'
,
chat
=>
{
api
.
listen
.
on
(
'
chatReconnected
'
,
chat
=>
{
// XXX: For MUCs, we listen to enteredNewRoom instead
if
(
chat
.
get
(
'
type
'
)
===
_converse
.
PRIVATE_CHAT_TYPE
)
{
chat
.
fetchNewestMessages
();
}
});
_converse
.
api
.
listen
.
on
(
'
afterMessagesFetched
'
,
chat
=>
{
api
.
listen
.
on
(
'
afterMessagesFetched
'
,
chat
=>
{
// XXX: We don't want to query MAM every time this is triggered
// since it's not necessary when the chat is restored from cache.
// (given that BOSH or SMACKS will ensure that you get messages
...
...
@@ -226,7 +227,7 @@ converse.plugins.add('converse-mam', {
/************************ BEGIN API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The [XEP-0313](https://xmpp.org/extensions/xep-0313.html) Message Archive Management API
*
...
...
@@ -236,8 +237,8 @@ converse.plugins.add('converse-mam', {
* option in the configuration settings section, which you'll
* usually want to use in conjunction with this API.
*
* @namespace
_converse.
api.archive
* @memberOf
_converse.
api
* @namespace api.archive
* @memberOf api
*/
'
archive
'
:
{
/**
...
...
@@ -246,7 +247,7 @@ converse.plugins.add('converse-mam', {
* The options parameter can also be an instance of
* _converse.RSM to enable easy querying between results pages.
*
* @method
_converse.
api.archive.query
* @method api.archive.query
* @param {(Object|_converse.RSM)} options Query parameters, either
* MAM-specific or also for Result Set Management.
* Can be either an object or an instance of _converse.RSM.
...
...
@@ -276,7 +277,7 @@ converse.plugins.add('converse-mam', {
*
* let result;
* try {
* result = await
_converse.
api.archive.query();
* result = await api.archive.query();
* } catch (e) {
* // The query was not successful, perhaps inform the user?
* // The IQ stanza returned by the XMPP server is passed in, so that you
...
...
@@ -296,7 +297,7 @@ converse.plugins.add('converse-mam', {
* // For a particular user
* let result;
* try {
* result = await
_converse.
api.archive.query({'with': 'john@doe.net'});
* result = await api.archive.query({'with': 'john@doe.net'});
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -304,7 +305,7 @@ converse.plugins.add('converse-mam', {
* // For a particular room
* let result;
* try {
* result = await
_converse.
api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true});
* result = await api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true});
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -324,7 +325,7 @@ converse.plugins.add('converse-mam', {
* };
* let result;
* try {
* result = await
_converse.
api.archive.query(options);
* result = await api.archive.query(options);
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -339,7 +340,7 @@ converse.plugins.add('converse-mam', {
* // Return maximum 10 archived messages
* let result;
* try {
* result = await
_converse.
api.archive.query({'with': 'john@doe.net', 'max':10});
* result = await api.archive.query({'with': 'john@doe.net', 'max':10});
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -363,7 +364,7 @@ converse.plugins.add('converse-mam', {
*
* let result;
* try {
* result = await
_converse.
api.archive.query({'with': 'john@doe.net', 'max':10});
* result = await api.archive.query({'with': 'john@doe.net', 'max':10});
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -372,7 +373,7 @@ converse.plugins.add('converse-mam', {
*
* while (result.rsm) {
* try {
* result = await
_converse.
api.archive.query(rsm.next(10));
* result = await api.archive.query(rsm.next(10));
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -391,7 +392,7 @@ converse.plugins.add('converse-mam', {
*
* let result;
* try {
* result = await
_converse.
api.archive.query({'before': '', 'max':5});
* result = await api.archive.query({'before': '', 'max':5});
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -400,7 +401,7 @@ converse.plugins.add('converse-mam', {
*
* // Now we query again, to get the previous batch.
* try {
* result = await
_converse.
api.archive.query(rsm.previous(5););
* result = await api.archive.query(rsm.previous(5););
* } catch (e) {
* // The query was not successful
* }
...
...
@@ -409,7 +410,7 @@ converse.plugins.add('converse-mam', {
*
*/
async
query
(
options
)
{
if
(
!
_converse
.
api
.
connection
.
connected
())
{
if
(
!
api
.
connection
.
connected
())
{
throw
new
Error
(
'
Can
\'
t call `api.archive.query` before having established an XMPP session
'
);
}
const
attrs
=
{
'
type
'
:
'
set
'
};
...
...
@@ -423,7 +424,7 @@ converse.plugins.add('converse-mam', {
}
const
jid
=
attrs
.
to
||
_converse
.
bare_jid
;
const
supported
=
await
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
MAM
,
jid
);
const
supported
=
await
api
.
disco
.
supports
(
Strophe
.
NS
.
MAM
,
jid
);
if
(
!
supported
)
{
log
.
warn
(
`Did not fetch MAM archive for
${
jid
}
because it doesn't support
${
Strophe
.
NS
.
MAM
}
`
);
return
{
'
messages
'
:
[]};
...
...
@@ -479,7 +480,7 @@ converse.plugins.add('converse-mam', {
},
Strophe
.
NS
.
MAM
);
let
error
;
const
iq_result
=
await
_converse
.
api
.
sendIQ
(
stanza
,
_converse
.
api
.
settings
.
get
(
'
message_archiving_timeout
'
),
false
)
const
iq_result
=
await
api
.
sendIQ
(
stanza
,
api
.
settings
.
get
(
'
message_archiving_timeout
'
),
false
)
if
(
iq_result
===
null
)
{
const
err_msg
=
"
Timeout while trying to fetch archived messages.
"
;
log
.
error
(
err_msg
);
...
...
src/headless/converse-muc.js
View file @
030c26a8
...
...
@@ -102,13 +102,14 @@ converse.plugins.add('converse-muc', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
,
___
}
=
_converse
;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
allow_muc
'
:
true
,
'
allow_muc_invitations
'
:
true
,
'
auto_join_on_invite
'
:
false
,
...
...
@@ -122,9 +123,9 @@ converse.plugins.add('converse-muc', {
'
muc_nickname_from_jid
'
:
false
,
'
muc_show_logs_before_join
'
:
false
});
_converse
.
api
.
promises
.
add
([
'
roomsAutoJoined
'
]);
api
.
promises
.
add
([
'
roomsAutoJoined
'
]);
if
(
_converse
.
api
.
settings
.
get
(
'
locked_muc_domain
'
)
&&
!
isString
(
_converse
.
api
.
settings
.
get
(
'
muc_domain
'
)))
{
if
(
api
.
settings
.
get
(
'
locked_muc_domain
'
)
&&
!
isString
(
api
.
settings
.
get
(
'
muc_domain
'
)))
{
throw
new
Error
(
"
Config Error: it makes no sense to set locked_muc_domain
"
+
"
to true when muc_domain is not set
"
);
}
...
...
@@ -188,11 +189,11 @@ converse.plugins.add('converse-muc', {
if
(
!
u
.
isValidMUCJID
(
jid
))
{
return
log
.
warn
(
`invalid jid "
${
jid
}
" provided in url fragment`
);
}
await
_converse
.
api
.
waitUntil
(
'
roomsAutoJoined
'
);
await
api
.
waitUntil
(
'
roomsAutoJoined
'
);
if
(
_converse
.
allow_bookmarks
)
{
await
_converse
.
api
.
waitUntil
(
'
bookmarksInitialized
'
);
await
api
.
waitUntil
(
'
bookmarksInitialized
'
);
}
_converse
.
api
.
rooms
.
open
(
jid
);
api
.
rooms
.
open
(
jid
);
}
_converse
.
router
.
route
(
'
converse/room?jid=:jid
'
,
openRoom
);
...
...
@@ -207,7 +208,7 @@ converse.plugins.add('converse-muc', {
const
nick
=
_converse
.
xmppstatus
.
getNickname
();
if
(
nick
)
{
return
nick
;
}
else
if
(
_converse
.
api
.
settings
.
get
(
'
muc_nickname_from_jid
'
))
{
}
else
if
(
api
.
settings
.
get
(
'
muc_nickname_from_jid
'
))
{
return
Strophe
.
unescapeNode
(
Strophe
.
getNodeFromJid
(
_converse
.
bare_jid
));
}
}
...
...
@@ -219,7 +220,7 @@ converse.plugins.add('converse-muc', {
*/
settings
.
type
=
_converse
.
CHATROOMS_TYPE
;
settings
.
id
=
jid
;
const
chatbox
=
await
_converse
.
api
.
rooms
.
get
(
jid
,
settings
,
true
);
const
chatbox
=
await
api
.
rooms
.
get
(
jid
,
settings
,
true
);
chatbox
.
maybeShow
(
true
);
return
chatbox
;
}
...
...
@@ -247,7 +248,7 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoomMessages}
* @example _converse.api.listen.on('chatRoomMessageInitialized', model => { ... });
*/
_converse
.
api
.
trigger
(
'
chatRoomMessageInitialized
'
,
this
);
api
.
trigger
(
'
chatRoomMessageInitialized
'
,
this
);
},
/**
...
...
@@ -259,7 +260,7 @@ converse.plugins.add('converse-muc', {
* @returns { Boolean }
*/
mayBeModerated
()
{
return
[
'
all
'
,
'
moderator
'
].
includes
(
_converse
.
api
.
settings
.
get
(
'
allow_message_retraction
'
))
&&
return
[
'
all
'
,
'
moderator
'
].
includes
(
api
.
settings
.
get
(
'
allow_message_retraction
'
))
&&
this
.
collection
.
chatbox
.
canModerateMessages
();
},
...
...
@@ -351,7 +352,7 @@ converse.plugins.add('converse-muc', {
'
num_unread_general
'
:
0
,
'
bookmarked
'
:
false
,
'
chat_state
'
:
undefined
,
'
hidden
'
:
[
'
mobile
'
,
'
fullscreen
'
].
includes
(
_converse
.
api
.
settings
.
get
(
"
view_mode
"
)),
'
hidden
'
:
[
'
mobile
'
,
'
fullscreen
'
].
includes
(
api
.
settings
.
get
(
"
view_mode
"
)),
'
message_type
'
:
'
groupchat
'
,
'
name
'
:
''
,
'
num_unread
'
:
0
,
...
...
@@ -386,7 +387,7 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoom }
* @example _converse.api.listen.on('chatRoomInitialized', model => { ... });
*/
await
_converse
.
api
.
trigger
(
'
chatRoomInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
await
api
.
trigger
(
'
chatRoomInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
this
.
initialized
.
resolve
();
},
...
...
@@ -427,7 +428,7 @@ converse.plugins.add('converse-muc', {
nick
=
await
this
.
getAndPersistNickname
(
nick
);
if
(
!
nick
)
{
u
.
safeSave
(
this
.
session
,
{
'
connection_status
'
:
converse
.
ROOMSTATUS
.
NICKNAME_REQUIRED
});
if
(
_converse
.
api
.
settings
.
get
(
'
muc_show_logs_before_join
'
))
{
if
(
api
.
settings
.
get
(
'
muc_show_logs_before_join
'
))
{
await
this
.
fetchMessages
();
}
return
this
;
...
...
@@ -436,13 +437,13 @@ converse.plugins.add('converse-muc', {
'
from
'
:
_converse
.
connection
.
jid
,
'
to
'
:
this
.
getRoomJIDAndNick
()
}).
c
(
"
x
"
,
{
'
xmlns
'
:
Strophe
.
NS
.
MUC
})
.
c
(
"
history
"
,
{
'
maxstanzas
'
:
this
.
features
.
get
(
'
mam_enabled
'
)
?
0
:
_converse
.
api
.
settings
.
get
(
'
muc_history_max_stanzas
'
)}).
up
();
.
c
(
"
history
"
,
{
'
maxstanzas
'
:
this
.
features
.
get
(
'
mam_enabled
'
)
?
0
:
api
.
settings
.
get
(
'
muc_history_max_stanzas
'
)}).
up
();
if
(
password
)
{
stanza
.
cnode
(
Strophe
.
xmlElement
(
"
password
"
,
[],
password
));
}
this
.
session
.
save
(
'
connection_status
'
,
converse
.
ROOMSTATUS
.
CONNECTING
);
_converse
.
api
.
send
(
stanza
);
api
.
send
(
stanza
);
return
this
;
},
...
...
@@ -491,10 +492,10 @@ converse.plugins.add('converse-muc', {
* @type { _converse.ChatRoom}
* @example _converse.api.listen.on('enteredNewRoom', model => { ... });
*/
_converse
.
api
.
trigger
(
'
enteredNewRoom
'
,
this
);
api
.
trigger
(
'
enteredNewRoom
'
,
this
);
if
(
_converse
.
api
.
settings
.
get
(
'
auto_register_muc_nickname
'
)
&&
await
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
MUC_REGISTER
,
this
.
get
(
'
jid
'
)))
{
if
(
api
.
settings
.
get
(
'
auto_register_muc_nickname
'
)
&&
await
api
.
disco
.
supports
(
Strophe
.
NS
.
MUC_REGISTER
,
this
.
get
(
'
jid
'
)))
{
this
.
registerNickname
()
}
}
...
...
@@ -618,7 +619,7 @@ converse.plugins.add('converse-muc', {
},
invitesAllowed
()
{
return
_converse
.
api
.
settings
.
get
(
'
allow_muc_invitations
'
)
&&
return
api
.
settings
.
get
(
'
allow_muc_invitations
'
)
&&
(
this
.
features
.
get
(
'
open
'
)
||
this
.
getOwnAffiliation
()
===
"
owner
"
);
...
...
@@ -628,7 +629,7 @@ converse.plugins.add('converse-muc', {
const
name
=
this
.
get
(
'
name
'
);
if
(
name
)
{
return
name
;
}
else
if
(
_converse
.
api
.
settings
.
get
(
'
locked_muc_domain
'
)
===
'
hidden
'
)
{
}
else
if
(
api
.
settings
.
get
(
'
locked_muc_domain
'
)
===
'
hidden
'
)
{
return
Strophe
.
getNodeFromJid
(
this
.
get
(
'
jid
'
));
}
else
{
return
this
.
get
(
'
jid
'
);
...
...
@@ -671,7 +672,7 @@ converse.plugins.add('converse-muc', {
promise
.
reject
(
stanza
);
}
},
null
,
'
message
'
,
[
'
error
'
,
'
groupchat
'
],
id
);
_converse
.
api
.
send
(
el
)
api
.
send
(
el
)
return
promise
;
},
...
...
@@ -771,7 +772,7 @@ converse.plugins.add('converse-muc', {
}).
c
(
'
moderate
'
,
{
xmlns
:
Strophe
.
NS
.
MODERATE
})
.
c
(
'
retract
'
,
{
xmlns
:
Strophe
.
NS
.
RETRACT
}).
up
()
.
c
(
'
reason
'
).
t
(
reason
||
''
);
return
_converse
.
api
.
sendIQ
(
iq
,
null
,
false
);
return
api
.
sendIQ
(
iq
,
null
,
false
);
},
/**
...
...
@@ -795,7 +796,7 @@ converse.plugins.add('converse-muc', {
if
(
reason
&&
reason
.
length
>
0
)
{
iq
.
c
(
"
reason
"
,
reason
);
}
return
_converse
.
api
.
sendIQ
(
iq
);
return
api
.
sendIQ
(
iq
);
},
/**
...
...
@@ -813,7 +814,7 @@ converse.plugins.add('converse-muc', {
await
new
Promise
((
success
,
error
)
=>
disco_entity
.
destroy
({
success
,
error
}));
}
}
if
(
_converse
.
api
.
connection
.
connected
())
{
if
(
api
.
connection
.
connected
())
{
this
.
sendUnavailablePresence
(
exit_msg
);
}
u
.
safeSave
(
this
.
session
,
{
'
connection_status
'
:
converse
.
ROOMSTATUS
.
DISCONNECTED
});
...
...
@@ -836,7 +837,7 @@ converse.plugins.add('converse-muc', {
canModerateMessages
()
{
const
self
=
this
.
getOwnOccupant
();
return
self
&&
self
.
isModerator
()
&&
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
MODERATE
,
this
.
get
(
'
jid
'
));
return
self
&&
self
.
isModerator
()
&&
api
.
disco
.
supports
(
Strophe
.
NS
.
MODERATE
,
this
.
get
(
'
jid
'
));
},
sendUnavailablePresence
(
exit_msg
)
{
...
...
@@ -986,7 +987,7 @@ converse.plugins.add('converse-muc', {
// <gone/> is not applicable within MUC context
return
;
}
_converse
.
api
.
send
(
api
.
send
(
$msg
({
'
to
'
:
this
.
get
(
'
jid
'
),
'
type
'
:
'
groupchat
'
})
.
c
(
chat_state
,
{
'
xmlns
'
:
Strophe
.
NS
.
CHATSTATES
}).
up
()
.
c
(
'
no-store
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
HINTS
}).
up
()
...
...
@@ -1020,7 +1021,7 @@ converse.plugins.add('converse-muc', {
'
to
'
:
recipient
,
'
id
'
:
u
.
getUniqueId
()
}).
c
(
'
x
'
,
attrs
);
_converse
.
api
.
send
(
invitation
);
api
.
send
(
invitation
);
/**
* After the user has sent out a direct invitation (as per XEP-0249),
* to a roster contact, asking them to join a room.
...
...
@@ -1031,7 +1032,7 @@ converse.plugins.add('converse-muc', {
* @property {string} reason - The original reason for the invitation
* @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
*/
_converse
.
api
.
trigger
(
'
roomInviteSent
'
,
{
api
.
trigger
(
'
roomInviteSent
'
,
{
'
room
'
:
this
,
'
recipient
'
:
recipient
,
'
reason
'
:
reason
...
...
@@ -1046,7 +1047,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
refreshDiscoInfo
()
{
return
_converse
.
api
.
disco
.
refresh
(
this
.
get
(
'
jid
'
))
return
api
.
disco
.
refresh
(
this
.
get
(
'
jid
'
))
.
then
(()
=>
this
.
getDiscoInfo
())
.
catch
(
e
=>
log
.
error
(
e
));
},
...
...
@@ -1059,7 +1060,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
getDiscoInfo
()
{
return
_converse
.
api
.
disco
.
getIdentity
(
'
conference
'
,
'
text
'
,
this
.
get
(
'
jid
'
))
return
api
.
disco
.
getIdentity
(
'
conference
'
,
'
text
'
,
this
.
get
(
'
jid
'
))
.
then
(
identity
=>
this
.
save
({
'
name
'
:
identity
&&
identity
.
get
(
'
name
'
)}))
.
then
(()
=>
this
.
getDiscoInfoFields
())
.
then
(()
=>
this
.
getDiscoInfoFeatures
())
...
...
@@ -1075,7 +1076,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
async
getDiscoInfoFields
()
{
const
fields
=
await
_converse
.
api
.
disco
.
getFields
(
this
.
get
(
'
jid
'
));
const
fields
=
await
api
.
disco
.
getFields
(
this
.
get
(
'
jid
'
));
const
config
=
fields
.
reduce
((
config
,
f
)
=>
{
const
name
=
f
.
get
(
'
var
'
);
if
(
name
&&
name
.
startsWith
(
'
muc#roominfo_
'
))
{
...
...
@@ -1095,7 +1096,7 @@ converse.plugins.add('converse-muc', {
* @returns {Promise}
*/
async
getDiscoInfoFeatures
()
{
const
features
=
await
_converse
.
api
.
disco
.
getFeatures
(
this
.
get
(
'
jid
'
));
const
features
=
await
api
.
disco
.
getFeatures
(
this
.
get
(
'
jid
'
));
const
attrs
=
Object
.
assign
(
zipObject
(
converse
.
ROOM_FEATURES
,
converse
.
ROOM_FEATURES
.
map
(()
=>
false
)),
{
'
fetched
'
:
(
new
Date
()).
toISOString
()}
...
...
@@ -1194,7 +1195,7 @@ converse.plugins.add('converse-muc', {
* @returns { Promise<XMLElement> }
*/
fetchRoomConfiguration
()
{
return
_converse
.
api
.
sendIQ
(
return
api
.
sendIQ
(
$iq
({
'
to
'
:
this
.
get
(
'
jid
'
),
'
type
'
:
"
get
"
})
.
c
(
"
query
"
,
{
xmlns
:
Strophe
.
NS
.
MUC_OWNER
})
);
...
...
@@ -1213,7 +1214,7 @@ converse.plugins.add('converse-muc', {
.
c
(
"
query
"
,
{
xmlns
:
Strophe
.
NS
.
MUC_OWNER
})
.
c
(
"
x
"
,
{
xmlns
:
Strophe
.
NS
.
XFORM
,
type
:
"
submit
"
});
config
.
forEach
(
node
=>
iq
.
cnode
(
node
).
up
());
return
_converse
.
api
.
sendIQ
(
iq
);
return
api
.
sendIQ
(
iq
);
},
/**
...
...
@@ -1267,7 +1268,7 @@ converse.plugins.add('converse-muc', {
if
(
member
.
reason
!==
undefined
)
{
iq
.
c
(
"
reason
"
,
member
.
reason
);
}
return
_converse
.
api
.
sendIQ
(
iq
);
return
api
.
sendIQ
(
iq
);
},
/**
...
...
@@ -1309,7 +1310,7 @@ converse.plugins.add('converse-muc', {
if
(
reason
!==
null
)
{
iq
.
c
(
"
reason
"
,
reason
);
}
return
_converse
.
api
.
sendIQ
(
iq
).
then
(
onSuccess
).
catch
(
onError
);
return
api
.
sendIQ
(
iq
).
then
(
onSuccess
).
catch
(
onError
);
},
/**
...
...
@@ -1388,7 +1389,7 @@ converse.plugins.add('converse-muc', {
const
iq
=
$iq
({
to
:
this
.
get
(
'
jid
'
),
type
:
"
get
"
})
.
c
(
"
query
"
,
{
xmlns
:
Strophe
.
NS
.
MUC_ADMIN
})
.
c
(
"
item
"
,
{
'
affiliation
'
:
affiliation
});
const
result
=
await
_converse
.
api
.
sendIQ
(
iq
,
null
,
false
);
const
result
=
await
api
.
sendIQ
(
iq
,
null
,
false
);
if
(
result
===
null
)
{
const
err_msg
=
`Error: timeout while fetching
${
affiliation
}
list for MUC
${
this
.
get
(
'
jid
'
)}
`
;
const
err
=
new
Error
(
err_msg
);
...
...
@@ -1466,7 +1467,7 @@ converse.plugins.add('converse-muc', {
'
xmlns
'
:
Strophe
.
NS
.
DISCO_INFO
,
'
node
'
:
'
x-roomuser-item
'
})
const
result
=
await
_converse
.
api
.
sendIQ
(
stanza
,
null
,
false
);
const
result
=
await
api
.
sendIQ
(
stanza
,
null
,
false
);
if
(
u
.
isErrorObject
(
result
))
{
throw
result
;
}
...
...
@@ -1480,7 +1481,7 @@ converse.plugins.add('converse-muc', {
const
jid
=
this
.
get
(
'
jid
'
);
let
iq
,
err_msg
;
try
{
iq
=
await
_converse
.
api
.
sendIQ
(
iq
=
await
api
.
sendIQ
(
$iq
({
'
to
'
:
jid
,
'
from
'
:
_converse
.
connection
.
jid
,
...
...
@@ -1501,7 +1502,7 @@ converse.plugins.add('converse-muc', {
return
log
.
error
(
`Can't register the user register in the groupchat
${
jid
}
due to the required fields`
);
}
try
{
await
_converse
.
api
.
sendIQ
(
$iq
({
await
api
.
sendIQ
(
$iq
({
'
to
'
:
jid
,
'
from
'
:
_converse
.
connection
.
jid
,
'
type
'
:
'
set
'
...
...
@@ -1675,7 +1676,7 @@ converse.plugins.add('converse-muc', {
* @param { String } value
*/
setSubject
(
value
=
''
)
{
_converse
.
api
.
send
(
api
.
send
(
$msg
({
to
:
this
.
get
(
'
jid
'
),
from
:
_converse
.
connection
.
jid
,
...
...
@@ -1749,7 +1750,7 @@ converse.plugins.add('converse-muc', {
'
type
'
:
"
get
"
}).
c
(
"
ping
"
,
{
'
xmlns
'
:
Strophe
.
NS
.
PING
});
try
{
await
_converse
.
api
.
sendIQ
(
ping
);
await
api
.
sendIQ
(
ping
);
}
catch
(
e
)
{
if
(
e
===
null
)
{
log
.
error
(
`Timeout error while checking whether we're joined to MUC:
${
this
.
get
(
'
jid
'
)}
`
);
...
...
@@ -1950,14 +1951,14 @@ converse.plugins.add('converse-muc', {
this
.
updateMessage
(
message
,
original_stanza
);
}
if
(
message
||
stanza_utils
.
isReceipt
(
stanza
)
||
stanza_utils
.
isChatMarker
(
stanza
))
{
return
_converse
.
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
});
return
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
});
}
if
(
await
this
.
handleRetraction
(
attrs
)
||
await
this
.
handleModeration
(
attrs
)
||
this
.
subjectChangeHandled
(
attrs
)
||
this
.
ignorableCSN
(
attrs
))
{
return
_converse
.
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
});
return
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
});
}
this
.
setEditable
(
attrs
,
attrs
.
time
);
...
...
@@ -1968,7 +1969,7 @@ converse.plugins.add('converse-muc', {
const
msg
=
this
.
handleCorrection
(
attrs
)
||
await
this
.
createMessage
(
attrs
);
this
.
incrementUnreadMsgCounter
(
msg
);
}
_converse
.
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
,
'
chatbox
'
:
this
});
api
.
trigger
(
'
message
'
,
{
'
stanza
'
:
original_stanza
,
'
chatbox
'
:
this
});
},
handleModifyError
(
pres
)
{
...
...
@@ -2089,7 +2090,7 @@ converse.plugins.add('converse-muc', {
onNicknameClash
(
presence
)
{
if
(
_converse
.
api
.
settings
.
get
(
'
muc_nickname_from_jid
'
))
{
if
(
api
.
settings
.
get
(
'
muc_nickname_from_jid
'
))
{
const
nick
=
presence
.
getAttribute
(
'
from
'
).
split
(
'
/
'
)[
1
];
if
(
nick
===
_converse
.
getDefaultMUCNickname
())
{
this
.
join
(
nick
+
'
-2
'
);
...
...
@@ -2216,7 +2217,7 @@ converse.plugins.add('converse-muc', {
if
(
locked_room
)
{
if
(
this
.
get
(
'
auto_configure
'
))
{
this
.
autoConfigureChatRoom
().
then
(()
=>
this
.
refreshDiscoInfo
());
}
else
if
(
_converse
.
api
.
settings
.
get
(
'
muc_instant_rooms
'
))
{
}
else
if
(
api
.
settings
.
get
(
'
muc_instant_rooms
'
))
{
// Accept default configuration
this
.
sendConfiguration
().
then
(()
=>
this
.
refreshDiscoInfo
());
}
else
{
...
...
@@ -2320,7 +2321,7 @@ converse.plugins.add('converse-muc', {
vcards
.
filter
(
v
=>
v
).
forEach
(
vcard
=>
{
if
(
hash
&&
vcard
.
get
(
'
image_hash
'
)
!==
hash
)
{
_converse
.
api
.
vcard
.
update
(
vcard
,
true
);
api
.
vcard
.
update
(
vcard
,
true
);
}
});
},
...
...
@@ -2359,7 +2360,7 @@ converse.plugins.add('converse-muc', {
},
getAutoFetchedAffiliationLists
()
{
const
affs
=
_converse
.
api
.
settings
.
get
(
'
muc_fetch_members
'
);
const
affs
=
api
.
settings
.
get
(
'
muc_fetch_members
'
);
return
Array
.
isArray
(
affs
)
?
affs
:
(
affs
?
[
'
member
'
,
'
admin
'
,
'
owner
'
]
:
[]);
},
...
...
@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc', {
* @event _converse#membersFetched
* @example _converse.api.listen.on('membersFetched', () => { ... });
*/
_converse
.
api
.
trigger
(
'
membersFetched
'
);
api
.
trigger
(
'
membersFetched
'
);
},
findOccupant
(
data
)
{
...
...
@@ -2426,13 +2427,13 @@ converse.plugins.add('converse-muc', {
_converse
.
RoomsPanelModel
=
Model
.
extend
({
defaults
:
function
()
{
return
{
'
muc_domain
'
:
_converse
.
api
.
settings
.
get
(
'
muc_domain
'
),
'
muc_domain
'
:
api
.
settings
.
get
(
'
muc_domain
'
),
'
nick
'
:
_converse
.
getDefaultMUCNickname
()
}
},
setDomain
(
jid
)
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
locked_muc_domain
'
))
{
if
(
!
api
.
settings
.
get
(
'
locked_muc_domain
'
))
{
this
.
save
(
'
muc_domain
'
,
Strophe
.
getDomainFromJid
(
jid
));
}
}
...
...
@@ -2453,7 +2454,7 @@ converse.plugins.add('converse-muc', {
reason
=
x_el
.
getAttribute
(
'
reason
'
);
let
result
;
if
(
_converse
.
api
.
settings
.
get
(
'
auto_join_on_invite
'
))
{
if
(
api
.
settings
.
get
(
'
auto_join_on_invite
'
))
{
result
=
true
;
}
else
{
// Invite request might come from someone not your roster list
...
...
@@ -2478,7 +2479,7 @@ converse.plugins.add('converse-muc', {
}
};
if
(
_converse
.
api
.
settings
.
get
(
'
allow_muc_invitations
'
))
{
if
(
api
.
settings
.
get
(
'
allow_muc_invitations
'
))
{
const
registerDirectInvitationHandler
=
function
()
{
_converse
.
connection
.
addHandler
(
(
message
)
=>
{
...
...
@@ -2486,15 +2487,15 @@ converse.plugins.add('converse-muc', {
return
true
;
},
'
jabber:x:conference
'
,
'
message
'
);
};
_converse
.
api
.
listen
.
on
(
'
connected
'
,
registerDirectInvitationHandler
);
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
registerDirectInvitationHandler
);
api
.
listen
.
on
(
'
connected
'
,
registerDirectInvitationHandler
);
api
.
listen
.
on
(
'
reconnected
'
,
registerDirectInvitationHandler
);
}
const
createChatRoom
=
function
(
jid
,
attrs
)
{
if
(
jid
.
startsWith
(
'
xmpp:
'
)
&&
jid
.
endsWith
(
'
?join
'
))
{
jid
=
jid
.
replace
(
/^xmpp:/
,
''
).
replace
(
/
\?
join$/
,
''
);
}
return
_converse
.
api
.
rooms
.
get
(
jid
,
attrs
,
true
);
return
api
.
rooms
.
get
(
jid
,
attrs
,
true
);
};
/**
...
...
@@ -2504,14 +2505,14 @@ converse.plugins.add('converse-muc', {
* settings).
*/
function
autoJoinRooms
()
{
_converse
.
api
.
settings
.
get
(
'
auto_join_rooms
'
).
forEach
(
groupchat
=>
{
api
.
settings
.
get
(
'
auto_join_rooms
'
).
forEach
(
groupchat
=>
{
if
(
isString
(
groupchat
))
{
if
(
_converse
.
chatboxes
.
where
({
'
jid
'
:
groupchat
}).
length
)
{
return
;
}
_converse
.
api
.
rooms
.
open
(
groupchat
);
api
.
rooms
.
open
(
groupchat
);
}
else
if
(
isObject
(
groupchat
))
{
_converse
.
api
.
rooms
.
open
(
groupchat
.
jid
,
clone
(
groupchat
));
api
.
rooms
.
open
(
groupchat
.
jid
,
clone
(
groupchat
));
}
else
{
log
.
error
(
'
Invalid groupchat criteria specified for "auto_join_rooms"
'
);
}
...
...
@@ -2523,40 +2524,40 @@ converse.plugins.add('converse-muc', {
* @example _converse.api.listen.on('roomsAutoJoined', () => { ... });
* @example _converse.api.waitUntil('roomsAutoJoined').then(() => { ... });
*/
_converse
.
api
.
trigger
(
'
roomsAutoJoined
'
);
api
.
trigger
(
'
roomsAutoJoined
'
);
}
async
function
onWindowStateChanged
(
data
)
{
if
(
data
.
state
===
'
visible
'
&&
_converse
.
api
.
connection
.
connected
())
{
const
rooms
=
await
_converse
.
api
.
rooms
.
get
();
if
(
data
.
state
===
'
visible
'
&&
api
.
connection
.
connected
())
{
const
rooms
=
await
api
.
rooms
.
get
();
rooms
.
forEach
(
room
=>
room
.
rejoinIfNecessary
());
}
}
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
beforeTearDown
'
,
()
=>
{
api
.
listen
.
on
(
'
beforeTearDown
'
,
()
=>
{
const
groupchats
=
_converse
.
chatboxes
.
where
({
'
type
'
:
_converse
.
CHATROOMS_TYPE
});
groupchats
.
forEach
(
muc
=>
u
.
safeSave
(
muc
.
session
,
{
'
connection_status
'
:
converse
.
ROOMSTATUS
.
DISCONNECTED
}));
});
_converse
.
api
.
listen
.
on
(
'
windowStateChanged
'
,
onWindowStateChanged
);
api
.
listen
.
on
(
'
windowStateChanged
'
,
onWindowStateChanged
);
_converse
.
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
{
if
(
_converse
.
api
.
settings
.
get
(
'
allow_muc
'
))
{
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
MUC
);
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
{
if
(
api
.
settings
.
get
(
'
allow_muc
'
))
{
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
MUC
);
}
if
(
_converse
.
api
.
settings
.
get
(
'
allow_muc_invitations
'
))
{
_converse
.
api
.
disco
.
own
.
features
.
add
(
'
jabber:x:conference
'
);
// Invites
if
(
api
.
settings
.
get
(
'
allow_muc_invitations
'
))
{
api
.
disco
.
own
.
features
.
add
(
'
jabber:x:conference
'
);
// Invites
}
});
_converse
.
api
.
listen
.
on
(
'
chatBoxesFetched
'
,
autoJoinRooms
);
api
.
listen
.
on
(
'
chatBoxesFetched
'
,
autoJoinRooms
);
_converse
.
api
.
listen
.
on
(
'
beforeResourceBinding
'
,
()
=>
{
api
.
listen
.
on
(
'
beforeResourceBinding
'
,
()
=>
{
_converse
.
connection
.
addHandler
(
stanza
=>
{
const
muc_jid
=
Strophe
.
getBareJidFromJid
(
stanza
.
getAttribute
(
'
from
'
));
if
(
!
_converse
.
chatboxes
.
get
(
muc_jid
))
{
_converse
.
api
.
waitUntil
(
'
chatBoxesFetched
'
)
api
.
waitUntil
(
'
chatBoxesFetched
'
)
.
then
(
async
()
=>
{
const
muc
=
_converse
.
chatboxes
.
get
(
muc_jid
);
if
(
muc
)
{
...
...
@@ -2580,11 +2581,11 @@ converse.plugins.add('converse-muc', {
.
filter
(
m
=>
(
m
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
))
.
forEach
(
m
=>
m
.
session
.
save
({
'
connection_status
'
:
converse
.
ROOMSTATUS
.
DISCONNECTED
}));
}
_converse
.
api
.
listen
.
on
(
'
disconnected
'
,
disconnectChatRooms
);
api
.
listen
.
on
(
'
disconnected
'
,
disconnectChatRooms
);
_converse
.
api
.
listen
.
on
(
'
statusInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
statusInitialized
'
,
()
=>
{
window
.
addEventListener
(
_converse
.
unloadevent
,
()
=>
{
const
using_websocket
=
_converse
.
api
.
connection
.
isType
(
'
websocket
'
);
const
using_websocket
=
api
.
connection
.
isType
(
'
websocket
'
);
if
(
using_websocket
&&
(
!
_converse
.
enable_smacks
||
!
_converse
.
session
.
get
(
'
smacks_stream_id
'
)))
{
// For non-SMACKS websocket connections, or non-resumeable
...
...
@@ -2601,22 +2602,22 @@ converse.plugins.add('converse-muc', {
converse
.
env
.
muc_utils
=
muc_utils
;
// We extend the default converse.js API to add methods specific to MUC groupchats.
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* The "rooms" namespace groups methods relevant to chatrooms
* (aka groupchats).
*
* @namespace
_converse.
api.rooms
* @memberOf
_converse.
api
* @namespace api.rooms
* @memberOf api
*/
rooms
:
{
/**
* Creates a new MUC chatroom (aka groupchat)
*
* Similar to {@link
_converse.
api.rooms.open}, but creates
* Similar to {@link api.rooms.open}, but creates
* the chatroom in the background (i.e. doesn't cause a view to open).
*
* @method
_converse.
api.rooms.create
* @method api.rooms.create
* @param {(string[]|string)} jid|jids The JID or array of
* JIDs of the chatroom(s) to create
* @param {object} [attrs] attrs The room attributes
...
...
@@ -2624,7 +2625,7 @@ converse.plugins.add('converse-muc', {
*/
create
(
jids
,
attrs
=
{})
{
attrs
=
isString
(
attrs
)
?
{
'
nick
'
:
attrs
}
:
(
attrs
||
{});
if
(
!
attrs
.
nick
&&
_converse
.
api
.
settings
.
get
(
'
muc_nickname_from_jid
'
))
{
if
(
!
attrs
.
nick
&&
api
.
settings
.
get
(
'
muc_nickname_from_jid
'
))
{
attrs
.
nick
=
Strophe
.
getNodeFromJid
(
_converse
.
bare_jid
);
}
if
(
jids
===
undefined
)
{
...
...
@@ -2638,9 +2639,9 @@ converse.plugins.add('converse-muc', {
/**
* Opens a MUC chatroom (aka groupchat)
*
* Similar to {@link
_converse.
api.chats.open}, but for groupchats.
* Similar to {@link api.chats.open}, but for groupchats.
*
* @method
_converse.
api.rooms.open
* @method api.rooms.open
* @param {string} jid The room JID or JIDs (if not specified, all
* currently open rooms will be returned).
* @param {string} attrs A map containing any extra room attributes.
...
...
@@ -2667,19 +2668,19 @@ converse.plugins.add('converse-muc', {
* @returns {Promise} Promise which resolves with the Model representing the chat.
*
* @example
* this.
_converse.
api.rooms.open('group@muc.example.com')
* this.api.rooms.open('group@muc.example.com')
*
* @example
* // To return an array of rooms, provide an array of room JIDs:
*
_converse.
api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com'])
* api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com'])
*
* @example
* // To setup a custom nickname when joining the room, provide the optional nick argument:
*
_converse.
api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'})
* api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'})
*
* @example
* // For example, opening a room with a specific default configuration:
*
_converse.
api.rooms.open(
* api.rooms.open(
* 'myroom@conference.example.org',
* { 'nick': 'coolguy69',
* 'auto_configure': true,
...
...
@@ -2695,17 +2696,17 @@ converse.plugins.add('converse-muc', {
* );
*/
async
open
(
jids
,
attrs
,
force
=
false
)
{
await
_converse
.
api
.
waitUntil
(
'
chatBoxesFetched
'
);
await
api
.
waitUntil
(
'
chatBoxesFetched
'
);
if
(
jids
===
undefined
)
{
const
err_msg
=
'
rooms.open: You need to provide at least one JID
'
;
log
.
error
(
err_msg
);
throw
(
new
TypeError
(
err_msg
));
}
else
if
(
isString
(
jids
))
{
const
room
=
await
_converse
.
api
.
rooms
.
create
(
jids
,
attrs
);
const
room
=
await
api
.
rooms
.
create
(
jids
,
attrs
);
room
&&
room
.
maybeShow
(
force
);
return
room
;
}
else
{
const
rooms
=
await
Promise
.
all
(
jids
.
map
(
jid
=>
_converse
.
api
.
rooms
.
create
(
jid
,
attrs
)));
const
rooms
=
await
Promise
.
all
(
jids
.
map
(
jid
=>
api
.
rooms
.
create
(
jid
,
attrs
)));
rooms
.
forEach
(
r
=>
r
.
maybeShow
(
force
));
return
rooms
;
}
...
...
@@ -2714,7 +2715,7 @@ converse.plugins.add('converse-muc', {
/**
* Fetches the object representing a MUC chatroom (aka groupchat)
*
* @method
_converse.
api.rooms.get
* @method api.rooms.get
* @param {string} [jid] The room JID (if not specified, all rooms will be returned).
* @param {object} attrs A map containing any extra room attributes For example, if you want
* to specify the nickname, use `{'nick': 'bloodninja'}`. Previously (before
...
...
@@ -2726,9 +2727,9 @@ converse.plugins.add('converse-muc', {
* if not found (default: `false`)
* @returns { Promise<_converse.ChatRoom> }
* @example
*
_converse.
api.waitUntil('roomsAutoJoined').then(() => {
* api.waitUntil('roomsAutoJoined').then(() => {
* const create_if_not_found = true;
*
_converse.
api.rooms.get(
* api.rooms.get(
* 'group@muc.example.com',
* {'nick': 'dread-pirate-roberts'},
* create_if_not_found
...
...
@@ -2737,9 +2738,9 @@ converse.plugins.add('converse-muc', {
*/
async
get
(
jids
,
attrs
=
{},
create
=
false
)
{
async
function
_get
(
jid
)
{
let
model
=
await
_converse
.
api
.
chatboxes
.
get
(
jid
);
let
model
=
await
api
.
chatboxes
.
get
(
jid
);
if
(
!
model
&&
create
)
{
model
=
await
_converse
.
api
.
chatboxes
.
create
(
jid
,
attrs
,
_converse
.
ChatRoom
);
model
=
await
api
.
chatboxes
.
create
(
jid
,
attrs
,
_converse
.
ChatRoom
);
}
else
{
model
=
(
model
&&
model
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
)
?
model
:
null
;
if
(
model
&&
Object
.
keys
(
attrs
).
length
)
{
...
...
@@ -2749,7 +2750,7 @@ converse.plugins.add('converse-muc', {
return
model
;
}
if
(
jids
===
undefined
)
{
const
chats
=
await
_converse
.
api
.
chatboxes
.
get
();
const
chats
=
await
api
.
chatboxes
.
get
();
return
chats
.
filter
(
c
=>
(
c
.
get
(
'
type
'
)
===
_converse
.
CHATROOMS_TYPE
));
}
else
if
(
isString
(
jids
))
{
return
_get
(
jids
);
...
...
src/headless/converse-ping.js
View file @
030c26a8
...
...
@@ -22,9 +22,11 @@ converse.plugins.add('converse-ping', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
let
lastStanzaDate
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
ping_interval
:
60
//in seconds
});
...
...
@@ -39,14 +41,14 @@ converse.plugins.add('converse-ping', {
function
registerPongHandler
()
{
if
(
_converse
.
connection
.
disco
!==
undefined
)
{
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
PING
);
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
PING
);
}
return
_converse
.
connection
.
addHandler
(
pong
,
Strophe
.
NS
.
PING
,
"
iq
"
,
"
get
"
);
}
function
registerPingHandler
()
{
_converse
.
connection
.
addHandler
(()
=>
{
if
(
_converse
.
api
.
settings
.
get
(
'
ping_interval
'
)
>
0
)
{
if
(
api
.
settings
.
get
(
'
ping_interval
'
)
>
0
)
{
// Handler on each stanza, saves the received date
// in order to ping only when needed.
lastStanzaDate
=
new
Date
();
...
...
@@ -56,13 +58,13 @@ converse.plugins.add('converse-ping', {
}
setTimeout
(()
=>
{
if
(
_converse
.
api
.
settings
.
get
(
'
ping_interval
'
)
>
0
)
{
if
(
api
.
settings
.
get
(
'
ping_interval
'
)
>
0
)
{
const
now
=
new
Date
();
if
(
!
lastStanzaDate
)
{
lastStanzaDate
=
now
;
}
if
((
now
-
lastStanzaDate
)
/
1000
>
_converse
.
api
.
settings
.
get
(
'
ping_interval
'
))
{
return
_converse
.
api
.
ping
();
if
((
now
-
lastStanzaDate
)
/
1000
>
api
.
settings
.
get
(
'
ping_interval
'
))
{
return
api
.
ping
();
}
return
true
;
}
...
...
@@ -75,25 +77,25 @@ converse.plugins.add('converse-ping', {
registerPongHandler
();
registerPingHandler
();
};
_converse
.
api
.
listen
.
on
(
'
connected
'
,
onConnected
);
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
onConnected
);
api
.
listen
.
on
(
'
connected
'
,
onConnected
);
api
.
listen
.
on
(
'
reconnected
'
,
onConnected
);
function
onWindowStateChanged
(
data
)
{
if
(
data
.
state
===
'
visible
'
&&
_converse
.
api
.
connection
.
connected
())
{
_converse
.
api
.
ping
(
null
,
5000
);
if
(
data
.
state
===
'
visible
'
&&
api
.
connection
.
connected
())
{
api
.
ping
(
null
,
5000
);
}
}
_converse
.
api
.
listen
.
on
(
'
windowStateChanged
'
,
onWindowStateChanged
);
api
.
listen
.
on
(
'
windowStateChanged
'
,
onWindowStateChanged
);
/************************ END Event Handlers ************************/
/************************ BEGIN API ************************/
Object
.
assign
(
_converse
.
api
,
{
Object
.
assign
(
api
,
{
/**
* Pings the service represented by the passed in JID by sending an IQ stanza.
* @private
* @method
_converse.
api.ping
* @method api.ping
* @param { String } [jid] - The JID of the service to ping
* @param { Integer } [timeout] - The amount of time in
* milliseconds to wait for a response. The default is 10000;
...
...
@@ -112,11 +114,11 @@ converse.plugins.add('converse-ping', {
'
id
'
:
u
.
getUniqueId
(
'
ping
'
)
}).
c
(
'
ping
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
PING
});
const
result
=
await
_converse
.
api
.
sendIQ
(
iq
,
timeout
||
10000
,
false
);
const
result
=
await
api
.
sendIQ
(
iq
,
timeout
||
10000
,
false
);
if
(
result
===
null
)
{
log
.
warn
(
`Timeout while pinging
${
jid
}
`
);
if
(
jid
===
Strophe
.
getDomainFromJid
(
_converse
.
bare_jid
))
{
_converse
.
api
.
connection
.
reconnect
();
api
.
connection
.
reconnect
();
}
}
else
if
(
u
.
isErrorStanza
(
result
))
{
log
.
error
(
`Error while pinging
${
jid
}
`
);
...
...
src/headless/converse-pubsub.js
View file @
030c26a8
...
...
@@ -21,6 +21,7 @@ converse.plugins.add('converse-pubsub', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
/************************ BEGIN API ************************/
...
...
@@ -58,7 +59,7 @@ converse.plugins.add('converse-pubsub', {
if
(
options
)
{
jid
=
jid
||
_converse
.
bare_jid
;
if
(
await
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
PUBSUB
+
'
#publish-options
'
,
jid
))
{
if
(
await
api
.
disco
.
supports
(
Strophe
.
NS
.
PUBSUB
+
'
#publish-options
'
,
jid
))
{
stanza
.
c
(
'
publish-options
'
)
.
c
(
'
x
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
XFORM
,
'
type
'
:
'
submit
'
})
.
c
(
'
field
'
,
{
'
var
'
:
'
FORM_TYPE
'
,
'
type
'
:
'
hidden
'
})
...
...
@@ -71,7 +72,7 @@ converse.plugins.add('converse-pubsub', {
}
}
try
{
_converse
.
api
.
sendIQ
(
stanza
);
api
.
sendIQ
(
stanza
);
}
catch
(
iq
)
{
if
(
iq
instanceof
Element
&&
strict_options
&&
...
...
@@ -82,7 +83,7 @@ converse.plugins.add('converse-pubsub', {
const
el
=
stanza
.
nodeTree
;
el
.
querySelector
(
'
publish-options
'
).
outerHTML
=
''
;
log
.
warn
(
`PubSub: Republishing without publish options.
${
el
.
outerHTML
}
`
);
_converse
.
api
.
sendIQ
(
el
);
api
.
sendIQ
(
el
);
}
else
{
throw
iq
;
}
...
...
src/headless/converse-roster.js
View file @
030c26a8
...
...
@@ -22,16 +22,17 @@ converse.plugins.add('converse-roster', {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
,
{
__
}
=
_converse
;
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
const
{
__
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
allow_contact_requests
'
:
true
,
'
auto_subscribe
'
:
false
,
'
synchronize_availability
'
:
true
,
});
_converse
.
api
.
promises
.
add
([
api
.
promises
.
add
([
'
cachedRoster
'
,
'
roster
'
,
'
rosterContactsFetched
'
,
...
...
@@ -73,7 +74,7 @@ converse.plugins.add('converse-roster', {
_converse
.
rejectPresenceSubscription
=
function
(
jid
,
message
)
{
const
pres
=
$pres
({
to
:
jid
,
type
:
"
unsubscribed
"
});
if
(
message
&&
message
!==
""
)
{
pres
.
c
(
"
status
"
).
t
(
message
);
}
_converse
.
api
.
send
(
pres
);
api
.
send
(
pres
);
};
...
...
@@ -107,9 +108,9 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('rosterGroupsFetched', () => { ... });
* @example _converse.api.waitUntil('rosterGroupsFetched').then(() => { ... });
*/
_converse
.
api
.
trigger
(
'
rosterGroupsFetched
'
);
api
.
trigger
(
'
rosterGroupsFetched
'
);
await
_converse
.
roster
.
fetchRosterContacts
();
_converse
.
api
.
trigger
(
'
rosterContactsFetched
'
);
api
.
trigger
(
'
rosterContactsFetched
'
);
}
catch
(
reason
)
{
log
.
error
(
reason
);
}
finally
{
...
...
@@ -231,14 +232,14 @@ converse.plugins.add('converse-roster', {
* @type { _converse.RosterContact }
* @example _converse.api.listen.on('contactPresenceChanged', contact => { ... });
*/
this
.
listenTo
(
this
.
presence
,
'
change:show
'
,
()
=>
_converse
.
api
.
trigger
(
'
contactPresenceChanged
'
,
this
));
this
.
listenTo
(
this
.
presence
,
'
change:show
'
,
()
=>
api
.
trigger
(
'
contactPresenceChanged
'
,
this
));
this
.
listenTo
(
this
.
presence
,
'
change:show
'
,
()
=>
this
.
trigger
(
'
presenceChanged
'
));
/**
* Synchronous event which provides a hook for further initializing a RosterContact
* @event _converse#rosterContactInitialized
* @param { _converse.RosterContact } contact
*/
await
_converse
.
api
.
trigger
(
'
rosterContactInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
await
api
.
trigger
(
'
rosterContactInitialized
'
,
this
,
{
'
Synchronous
'
:
true
});
this
.
initialized
.
resolve
();
},
...
...
@@ -277,7 +278,7 @@ converse.plugins.add('converse-roster', {
if
(
nick
)
{
pres
.
c
(
'
nick
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
NICK
}).
t
(
nick
).
up
();
}
_converse
.
api
.
send
(
pres
);
api
.
send
(
pres
);
this
.
save
(
'
ask
'
,
"
subscribe
"
);
// ask === 'subscribe' Means we have asked to subscribe to them.
return
this
;
},
...
...
@@ -291,7 +292,7 @@ converse.plugins.add('converse-roster', {
* @method _converse.RosterContacts#ackSubscribe
*/
ackSubscribe
()
{
_converse
.
api
.
send
(
$pres
({
api
.
send
(
$pres
({
'
type
'
:
'
subscribe
'
,
'
to
'
:
this
.
get
(
'
jid
'
)
}));
...
...
@@ -308,7 +309,7 @@ converse.plugins.add('converse-roster', {
* @param { String } jid - The Jabber ID of the user who is unsubscribing
*/
ackUnsubscribe
()
{
_converse
.
api
.
send
(
$pres
({
'
type
'
:
'
unsubscribe
'
,
'
to
'
:
this
.
get
(
'
jid
'
)}));
api
.
send
(
$pres
({
'
type
'
:
'
unsubscribe
'
,
'
to
'
:
this
.
get
(
'
jid
'
)}));
this
.
removeFromRoster
();
this
.
destroy
();
},
...
...
@@ -335,7 +336,7 @@ converse.plugins.add('converse-roster', {
if
(
message
&&
message
!==
""
)
{
pres
.
c
(
"
status
"
).
t
(
message
);
}
_converse
.
api
.
send
(
pres
);
api
.
send
(
pres
);
return
this
;
},
...
...
@@ -349,7 +350,7 @@ converse.plugins.add('converse-roster', {
const
iq
=
$iq
({
type
:
'
set
'
})
.
c
(
'
query
'
,
{
xmlns
:
Strophe
.
NS
.
ROSTER
})
.
c
(
'
item
'
,
{
jid
:
this
.
get
(
'
jid
'
),
subscription
:
"
remove
"
});
return
_converse
.
api
.
sendIQ
(
iq
);
return
api
.
sendIQ
(
iq
);
}
});
...
...
@@ -441,7 +442,7 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('cachedRoster', (items) => { ... });
* @example _converse.api.waitUntil('cachedRoster').then(items => { ... });
*/
_converse
.
api
.
trigger
(
'
cachedRoster
'
,
result
);
api
.
trigger
(
'
cachedRoster
'
,
result
);
}
else
{
_converse
.
send_initial_presence
=
true
;
return
_converse
.
roster
.
fetchFromServer
();
...
...
@@ -498,7 +499,7 @@ converse.plugins.add('converse-roster', {
.
c
(
'
query
'
,
{
'
xmlns
'
:
Strophe
.
NS
.
ROSTER
})
.
c
(
'
item
'
,
{
jid
,
name
});
groups
.
forEach
(
g
=>
iq
.
c
(
'
group
'
).
t
(
g
).
up
());
return
_converse
.
api
.
sendIQ
(
iq
);
return
api
.
sendIQ
(
iq
);
},
/**
...
...
@@ -513,7 +514,7 @@ converse.plugins.add('converse-roster', {
* @param { Object } attributes - Any additional attributes to be stored on the user's model.
*/
async
addContactToRoster
(
jid
,
name
,
groups
,
attributes
)
{
await
_converse
.
api
.
waitUntil
(
'
rosterContactsFetched
'
);
await
api
.
waitUntil
(
'
rosterContactsFetched
'
);
groups
=
groups
||
[];
try
{
await
this
.
sendContactAddIQ
(
jid
,
name
,
groups
);
...
...
@@ -573,7 +574,7 @@ converse.plugins.add('converse-roster', {
);
return
;
}
_converse
.
api
.
send
(
$iq
({
type
:
'
result
'
,
id
,
from
:
_converse
.
connection
.
jid
}));
api
.
send
(
$iq
({
type
:
'
result
'
,
id
,
from
:
_converse
.
connection
.
jid
}));
const
query
=
sizzle
(
`query[xmlns="
${
Strophe
.
NS
.
ROSTER
}
"]`
,
iq
).
pop
();
this
.
data
.
save
(
'
version
'
,
query
.
getAttribute
(
'
ver
'
));
...
...
@@ -595,12 +596,12 @@ converse.plugins.add('converse-roster', {
* @type { XMLElement }
* @example _converse.api.listen.on('rosterPush', iq => { ... });
*/
_converse
.
api
.
trigger
(
'
rosterPush
'
,
iq
);
api
.
trigger
(
'
rosterPush
'
,
iq
);
return
;
},
rosterVersioningSupported
()
{
return
_converse
.
api
.
disco
.
stream
.
getFeature
(
'
ver
'
,
'
urn:xmpp:features:rosterver
'
)
&&
this
.
data
.
get
(
'
version
'
);
return
api
.
disco
.
stream
.
getFeature
(
'
ver
'
,
'
urn:xmpp:features:rosterver
'
)
&&
this
.
data
.
get
(
'
version
'
);
},
/**
...
...
@@ -617,7 +618,7 @@ converse.plugins.add('converse-roster', {
if
(
this
.
rosterVersioningSupported
())
{
stanza
.
attrs
({
'
ver
'
:
this
.
data
.
get
(
'
version
'
)});
}
const
iq
=
await
_converse
.
api
.
sendIQ
(
stanza
,
null
,
false
);
const
iq
=
await
api
.
sendIQ
(
stanza
,
null
,
false
);
if
(
iq
.
getAttribute
(
'
type
'
)
!==
'
error
'
)
{
const
query
=
sizzle
(
`query[xmlns="
${
Strophe
.
NS
.
ROSTER
}
"]`
,
iq
).
pop
();
if
(
query
)
{
...
...
@@ -641,7 +642,7 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('roster', iq => { ... });
* @example _converse.api.waitUntil('roster').then(iq => { ... });
*/
_converse
.
api
.
trigger
(
'
roster
'
,
iq
);
api
.
trigger
(
'
roster
'
,
iq
);
},
/* Update or create RosterContact models based on the given `item` XML
...
...
@@ -701,7 +702,7 @@ converse.plugins.add('converse-roster', {
* @type { _converse.RosterContact }
* @example _converse.api.listen.on('contactRequest', contact => { ... });
*/
_converse
.
api
.
trigger
(
'
contactRequest
'
,
this
.
create
(
user_data
));
api
.
trigger
(
'
contactRequest
'
,
this
.
create
(
user_data
));
},
...
...
@@ -710,13 +711,13 @@ converse.plugins.add('converse-roster', {
bare_jid
=
Strophe
.
getBareJidFromJid
(
jid
),
contact
=
this
.
get
(
bare_jid
);
if
(
!
_converse
.
api
.
settings
.
get
(
'
allow_contact_requests
'
))
{
if
(
!
api
.
settings
.
get
(
'
allow_contact_requests
'
))
{
_converse
.
rejectPresenceSubscription
(
jid
,
__
(
"
This client does not allow presence subscriptions
"
)
);
}
if
(
_converse
.
api
.
settings
.
get
(
'
auto_subscribe
'
))
{
if
(
api
.
settings
.
get
(
'
auto_subscribe
'
))
{
if
((
!
contact
)
||
(
contact
.
get
(
'
subscription
'
)
!==
'
to
'
))
{
this
.
subscribeBack
(
bare_jid
,
presence
);
}
else
{
...
...
@@ -742,8 +743,8 @@ converse.plugins.add('converse-roster', {
if
((
_converse
.
connection
.
jid
!==
jid
)
&&
(
presence_type
!==
'
unavailable
'
)
&&
(
_converse
.
api
.
settings
.
get
(
'
synchronize_availability
'
)
===
true
||
_converse
.
api
.
settings
.
get
(
'
synchronize_availability
'
)
===
resource
))
{
(
api
.
settings
.
get
(
'
synchronize_availability
'
)
===
true
||
api
.
settings
.
get
(
'
synchronize_availability
'
)
===
resource
))
{
// Another resource has changed its status and
// synchronize_availability option set to update,
// we'll update ours as well.
...
...
@@ -889,7 +890,7 @@ converse.plugins.add('converse-roster', {
}
}
_converse
.
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
{
api
.
listen
.
on
(
'
chatBoxesInitialized
'
,
()
=>
{
_converse
.
chatboxes
.
on
(
'
change:num_unread
'
,
updateUnreadCounter
);
_converse
.
chatboxes
.
on
(
'
add
'
,
chatbox
=>
{
...
...
@@ -899,9 +900,9 @@ converse.plugins.add('converse-roster', {
});
});
_converse
.
api
.
listen
.
on
(
'
beforeTearDown
'
,
()
=>
_converse
.
unregisterPresenceHandler
());
api
.
listen
.
on
(
'
beforeTearDown
'
,
()
=>
_converse
.
unregisterPresenceHandler
());
_converse
.
api
.
waitUntil
(
'
rosterContactsFetched
'
).
then
(()
=>
{
api
.
waitUntil
(
'
rosterContactsFetched
'
).
then
(()
=>
{
_converse
.
roster
.
on
(
'
add
'
,
(
contact
)
=>
{
/* When a new contact is added, check if we already have a
* chatbox open for it, and if so attach it to the chatbox.
...
...
@@ -917,9 +918,9 @@ converse.plugins.add('converse-roster', {
_converse
.
presences
&&
await
_converse
.
presences
.
clearStore
();
}
_converse
.
api
.
listen
.
on
(
'
streamResumptionFailed
'
,
()
=>
_converse
.
session
.
set
(
'
roster_cached
'
,
false
));
api
.
listen
.
on
(
'
streamResumptionFailed
'
,
()
=>
_converse
.
session
.
set
(
'
roster_cached
'
,
false
));
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
async
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
async
()
=>
{
await
clearPresences
();
if
(
_converse
.
shouldClearCache
())
{
if
(
_converse
.
rostergroups
)
{
...
...
@@ -934,7 +935,7 @@ converse.plugins.add('converse-roster', {
}
});
_converse
.
api
.
listen
.
on
(
'
statusInitialized
'
,
async
reconnecting
=>
{
api
.
listen
.
on
(
'
statusInitialized
'
,
async
reconnecting
=>
{
if
(
reconnecting
)
{
// When reconnecting and not resuming a previous session,
// we clear all cached presence data, since it might be stale
...
...
@@ -957,14 +958,14 @@ converse.plugins.add('converse-roster', {
* @type { bool }
* @example _converse.api.listen.on('presencesInitialized', reconnecting => { ... });
*/
_converse
.
api
.
trigger
(
'
presencesInitialized
'
,
reconnecting
);
api
.
trigger
(
'
presencesInitialized
'
,
reconnecting
);
});
async
function
initRoster
()
{
// Initialize the Bakcbone collections that represent the contats
// roster and the roster groups.
await
_converse
.
api
.
waitUntil
(
'
VCardsInitialized
'
);
await
api
.
waitUntil
(
'
VCardsInitialized
'
);
_converse
.
roster
=
new
_converse
.
RosterContacts
();
let
id
=
`converse.contacts-
${
_converse
.
bare_jid
}
`
;
_converse
.
roster
.
browserStorage
=
_converse
.
createStore
(
id
);
...
...
@@ -986,10 +987,10 @@ converse.plugins.add('converse-roster', {
* @example _converse.api.listen.on('rosterInitialized', () => { ... });
* @example _converse.api.waitUntil('rosterInitialized').then(() => { ... });
*/
_converse
.
api
.
trigger
(
'
rosterInitialized
'
);
api
.
trigger
(
'
rosterInitialized
'
);
}
_converse
.
api
.
listen
.
on
(
'
presencesInitialized
'
,
async
(
reconnecting
)
=>
{
api
.
listen
.
on
(
'
presencesInitialized
'
,
async
(
reconnecting
)
=>
{
if
(
reconnecting
)
{
/**
* Similar to `rosterInitialized`, but instead pertaining to reconnection.
...
...
@@ -998,7 +999,7 @@ converse.plugins.add('converse-roster', {
* @event _converse#rosterReadyAfterReconnection
* @example _converse.api.listen.on('rosterReadyAfterReconnection', () => { ... });
*/
_converse
.
api
.
trigger
(
'
rosterReadyAfterReconnection
'
);
api
.
trigger
(
'
rosterReadyAfterReconnection
'
);
}
else
{
await
initRoster
();
}
...
...
@@ -1050,7 +1051,7 @@ converse.plugins.add('converse-roster', {
* });
*/
async
get
(
jids
)
{
await
_converse
.
api
.
waitUntil
(
'
rosterContactsFetched
'
);
await
api
.
waitUntil
(
'
rosterContactsFetched
'
);
const
_getter
=
jid
=>
_converse
.
roster
.
get
(
Strophe
.
getBareJidFromJid
(
jid
));
if
(
jids
===
undefined
)
{
jids
=
_converse
.
roster
.
pluck
(
'
jid
'
);
...
...
@@ -1073,7 +1074,7 @@ converse.plugins.add('converse-roster', {
* _converse.api.contacts.add('buddy@example.com', 'Buddy')
*/
async
add
(
jid
,
name
)
{
await
_converse
.
api
.
waitUntil
(
'
rosterContactsFetched
'
);
await
api
.
waitUntil
(
'
rosterContactsFetched
'
);
if
(
!
isString
(
jid
)
||
!
jid
.
includes
(
'
@
'
))
{
throw
new
TypeError
(
'
contacts.add: invalid jid
'
);
}
...
...
src/headless/converse-smacks.js
View file @
030c26a8
...
...
@@ -18,21 +18,22 @@ converse.plugins.add('converse-smacks', {
initialize
()
{
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
'
enable_smacks
'
:
true
,
'
smacks_max_unacked_stanzas
'
:
5
,
});
function
isStreamManagementSupported
()
{
if
(
_converse
.
api
.
connection
.
isType
(
'
bosh
'
)
&&
!
_converse
.
isTestEnv
())
{
if
(
api
.
connection
.
isType
(
'
bosh
'
)
&&
!
_converse
.
isTestEnv
())
{
return
false
;
}
return
_converse
.
api
.
disco
.
stream
.
getFeature
(
'
sm
'
,
Strophe
.
NS
.
SM
);
return
api
.
disco
.
stream
.
getFeature
(
'
sm
'
,
Strophe
.
NS
.
SM
);
}
function
handleAck
(
el
)
{
...
...
@@ -69,7 +70,7 @@ converse.plugins.add('converse-smacks', {
if
(
_converse
.
session
.
get
(
'
smacks_enabled
'
))
{
const
h
=
_converse
.
session
.
get
(
'
num_stanzas_handled
'
);
const
stanza
=
u
.
toStanza
(
`<a xmlns="
${
Strophe
.
NS
.
SM
}
" h="
${
h
}
"/>`
);
_converse
.
api
.
send
(
stanza
);
api
.
send
(
stanza
);
}
return
true
;
}
...
...
@@ -132,7 +133,7 @@ converse.plugins.add('converse-smacks', {
* Triggered when the XEP-0198 stream could not be resumed.
* @event _converse#streamResumptionFailed
*/
_converse
.
api
.
trigger
(
'
streamResumptionFailed
'
);
api
.
trigger
(
'
streamResumptionFailed
'
);
return
true
;
}
...
...
@@ -158,7 +159,7 @@ converse.plugins.add('converse-smacks', {
// service worker or handling IQ[type="result"] stanzas
// differently, more like push stanzas, so that they don't need
// explicit handlers.
stanzas
.
forEach
(
s
=>
_converse
.
api
.
send
(
s
));
stanzas
.
forEach
(
s
=>
api
.
send
(
s
));
}
function
onResumedStanza
(
el
)
{
...
...
@@ -179,13 +180,13 @@ converse.plugins.add('converse-smacks', {
const
previous_id
=
_converse
.
session
.
get
(
'
smacks_stream_id
'
);
const
h
=
_converse
.
session
.
get
(
'
num_stanzas_handled
'
);
const
stanza
=
u
.
toStanza
(
`<resume xmlns="
${
Strophe
.
NS
.
SM
}
" h="
${
h
}
" previd="
${
previous_id
}
"/>`
);
_converse
.
api
.
send
(
stanza
);
api
.
send
(
stanza
);
_converse
.
connection
.
flush
();
await
promise
;
}
async
function
sendEnableStanza
()
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
enable_smacks
'
)
||
_converse
.
session
.
get
(
'
smacks_enabled
'
))
{
if
(
!
api
.
settings
.
get
(
'
enable_smacks
'
)
||
_converse
.
session
.
get
(
'
smacks_enabled
'
))
{
return
;
}
if
(
await
isStreamManagementSupported
())
{
...
...
@@ -193,16 +194,16 @@ converse.plugins.add('converse-smacks', {
_converse
.
connection
.
_addSysHandler
(
el
=>
promise
.
resolve
(
saveSessionData
(
el
)),
Strophe
.
NS
.
SM
,
'
enabled
'
);
_converse
.
connection
.
_addSysHandler
(
el
=>
promise
.
resolve
(
onFailedStanza
(
el
)),
Strophe
.
NS
.
SM
,
'
failed
'
);
const
resume
=
(
_converse
.
api
.
connection
.
isType
(
'
websocket
'
)
||
_converse
.
isTestEnv
());
const
resume
=
(
api
.
connection
.
isType
(
'
websocket
'
)
||
_converse
.
isTestEnv
());
const
stanza
=
u
.
toStanza
(
`<enable xmlns="
${
Strophe
.
NS
.
SM
}
" resume="
${
resume
}
"/>`
);
_converse
.
api
.
send
(
stanza
);
api
.
send
(
stanza
);
_converse
.
connection
.
flush
();
await
promise
;
}
}
async
function
enableStreamManagement
()
{
if
(
!
_converse
.
api
.
settings
.
get
(
'
enable_smacks
'
))
{
if
(
!
api
.
settings
.
get
(
'
enable_smacks
'
))
{
return
;
}
if
(
!
(
await
isStreamManagementSupported
()))
{
...
...
@@ -235,21 +236,21 @@ converse.plugins.add('converse-smacks', {
'
unacked_stanzas
'
,
(
_converse
.
session
.
get
(
'
unacked_stanzas
'
)
||
[]).
concat
([
stanza_string
])
);
const
max_unacked
=
_converse
.
api
.
settings
.
get
(
'
smacks_max_unacked_stanzas
'
);
const
max_unacked
=
api
.
settings
.
get
(
'
smacks_max_unacked_stanzas
'
);
if
(
max_unacked
>
0
)
{
const
num
=
_converse
.
session
.
get
(
'
num_stanzas_since_last_ack
'
)
+
1
;
if
(
num
%
max_unacked
===
0
)
{
// Request confirmation of sent stanzas
_converse
.
api
.
send
(
u
.
toStanza
(
`<r xmlns="
${
Strophe
.
NS
.
SM
}
"/>`
));
api
.
send
(
u
.
toStanza
(
`<r xmlns="
${
Strophe
.
NS
.
SM
}
"/>`
));
}
_converse
.
session
.
save
({
'
num_stanzas_since_last_ack
'
:
num
});
}
}
}
_converse
.
api
.
listen
.
on
(
'
userSessionInitialized
'
,
initSessionData
);
_converse
.
api
.
listen
.
on
(
'
beforeResourceBinding
'
,
enableStreamManagement
);
_converse
.
api
.
listen
.
on
(
'
afterResourceBinding
'
,
sendEnableStanza
);
_converse
.
api
.
listen
.
on
(
'
send
'
,
onStanzaSent
);
api
.
listen
.
on
(
'
userSessionInitialized
'
,
initSessionData
);
api
.
listen
.
on
(
'
beforeResourceBinding
'
,
enableStreamManagement
);
api
.
listen
.
on
(
'
afterResourceBinding
'
,
sendEnableStanza
);
api
.
listen
.
on
(
'
send
'
,
onStanzaSent
);
}
});
src/headless/converse-status.js
View file @
030c26a8
...
...
@@ -14,8 +14,9 @@ converse.plugins.add('converse-status', {
initialize
()
{
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
settings
.
update
({
api
.
settings
.
update
({
auto_away
:
0
,
// Seconds after which user status is set to 'away'
auto_xa
:
0
,
// Seconds after which user status is set to 'xa'
csi_waiting_time
:
0
,
// Support for XEP-0352. Seconds before client is considered idle and CSI is sent out.
...
...
@@ -25,7 +26,7 @@ converse.plugins.add('converse-status', {
_converse
.
XMPPStatus
=
Model
.
extend
({
defaults
()
{
return
{
"
status
"
:
_converse
.
api
.
settings
.
get
(
"
default_state
"
)}
return
{
"
status
"
:
api
.
settings
.
get
(
"
default_state
"
)}
},
initialize
()
{
...
...
@@ -50,7 +51,7 @@ converse.plugins.add('converse-status', {
constructPresence
(
type
,
status_message
)
{
let
presence
;
type
=
isString
(
type
)
?
type
:
(
this
.
get
(
'
status
'
)
||
_converse
.
api
.
settings
.
get
(
"
default_state
"
));
type
=
isString
(
type
)
?
type
:
(
this
.
get
(
'
status
'
)
||
api
.
settings
.
get
(
"
default_state
"
));
status_message
=
isString
(
status_message
)
?
status_message
:
this
.
get
(
'
status_message
'
);
// Most of these presence types are actually not explicitly sent,
// but I add all of them here for reference and future proofing.
...
...
@@ -73,7 +74,7 @@ converse.plugins.add('converse-status', {
presence
.
c
(
'
status
'
).
t
(
status_message
).
up
();
}
const
priority
=
_converse
.
api
.
settings
.
get
(
"
priority
"
);
const
priority
=
api
.
settings
.
get
(
"
priority
"
);
presence
.
c
(
'
priority
'
).
t
(
isNaN
(
Number
(
priority
))
?
0
:
priority
).
up
();
if
(
_converse
.
idle
)
{
const
idle_since
=
new
Date
();
...
...
@@ -84,7 +85,7 @@ converse.plugins.add('converse-status', {
},
sendPresence
(
type
,
status_message
)
{
_converse
.
api
.
send
(
this
.
constructPresence
(
type
,
status_message
));
api
.
send
(
this
.
constructPresence
(
type
,
status_message
));
}
});
...
...
@@ -97,7 +98,7 @@ converse.plugins.add('converse-status', {
* @param { String } stat - The user's chat status
*/
_converse
.
sendCSI
=
function
(
stat
)
{
_converse
.
api
.
send
(
$build
(
stat
,
{
xmlns
:
Strophe
.
NS
.
CSI
}));
api
.
send
(
$build
(
stat
,
{
xmlns
:
Strophe
.
NS
.
CSI
}));
_converse
.
inactive
=
(
stat
===
_converse
.
INACTIVE
)
?
true
:
false
;
};
...
...
@@ -123,7 +124,7 @@ converse.plugins.add('converse-status', {
_converse
.
auto_changed_status
=
false
;
// XXX: we should really remember the original state here, and
// then set it back to that...
_converse
.
xmppstatus
.
set
(
'
status
'
,
_converse
.
api
.
settings
.
get
(
"
default_state
"
));
_converse
.
xmppstatus
.
set
(
'
status
'
,
api
.
settings
.
get
(
"
default_state
"
));
}
};
...
...
@@ -138,24 +139,24 @@ converse.plugins.add('converse-status', {
}
const
stat
=
_converse
.
xmppstatus
.
get
(
'
status
'
);
_converse
.
idle_seconds
++
;
if
(
_converse
.
api
.
settings
.
get
(
"
csi_waiting_time
"
)
>
0
&&
_converse
.
idle_seconds
>
_converse
.
api
.
settings
.
get
(
"
csi_waiting_time
"
)
&&
if
(
api
.
settings
.
get
(
"
csi_waiting_time
"
)
>
0
&&
_converse
.
idle_seconds
>
api
.
settings
.
get
(
"
csi_waiting_time
"
)
&&
!
_converse
.
inactive
)
{
_converse
.
sendCSI
(
_converse
.
INACTIVE
);
}
if
(
_converse
.
api
.
settings
.
get
(
"
idle_presence_timeout
"
)
>
0
&&
_converse
.
idle_seconds
>
_converse
.
api
.
settings
.
get
(
"
idle_presence_timeout
"
)
&&
if
(
api
.
settings
.
get
(
"
idle_presence_timeout
"
)
>
0
&&
_converse
.
idle_seconds
>
api
.
settings
.
get
(
"
idle_presence_timeout
"
)
&&
!
_converse
.
idle
)
{
_converse
.
idle
=
true
;
_converse
.
xmppstatus
.
sendPresence
();
}
if
(
_converse
.
api
.
settings
.
get
(
"
auto_away
"
)
>
0
&&
_converse
.
idle_seconds
>
_converse
.
api
.
settings
.
get
(
"
auto_away
"
)
&&
if
(
api
.
settings
.
get
(
"
auto_away
"
)
>
0
&&
_converse
.
idle_seconds
>
api
.
settings
.
get
(
"
auto_away
"
)
&&
stat
!==
'
away
'
&&
stat
!==
'
xa
'
&&
stat
!==
'
dnd
'
)
{
_converse
.
auto_changed_status
=
true
;
_converse
.
xmppstatus
.
set
(
'
status
'
,
'
away
'
);
}
else
if
(
_converse
.
api
.
settings
.
get
(
"
auto_xa
"
)
>
0
&&
_converse
.
idle_seconds
>
_converse
.
api
.
settings
.
get
(
"
auto_xa
"
)
&&
}
else
if
(
api
.
settings
.
get
(
"
auto_xa
"
)
>
0
&&
_converse
.
idle_seconds
>
api
.
settings
.
get
(
"
auto_xa
"
)
&&
stat
!==
'
xa
'
&&
stat
!==
'
dnd
'
)
{
_converse
.
auto_changed_status
=
true
;
_converse
.
xmppstatus
.
set
(
'
status
'
,
'
xa
'
);
...
...
@@ -167,10 +168,10 @@ converse.plugins.add('converse-status', {
* Required for the auto_away, auto_xa and csi_waiting_time features.
*/
if
(
_converse
.
api
.
settings
.
get
(
"
auto_away
"
)
<
1
&&
_converse
.
api
.
settings
.
get
(
"
auto_xa
"
)
<
1
&&
_converse
.
api
.
settings
.
get
(
"
csi_waiting_time
"
)
<
1
&&
_converse
.
api
.
settings
.
get
(
"
idle_presence_timeout
"
)
<
1
api
.
settings
.
get
(
"
auto_away
"
)
<
1
&&
api
.
settings
.
get
(
"
auto_xa
"
)
<
1
&&
api
.
settings
.
get
(
"
csi_waiting_time
"
)
<
1
&&
api
.
settings
.
get
(
"
idle_presence_timeout
"
)
<
1
)
{
// Waiting time of less then one second means features aren't used.
return
;
...
...
@@ -192,7 +193,7 @@ converse.plugins.add('converse-status', {
};
_converse
.
api
.
listen
.
on
(
'
presencesInitialized
'
,
(
reconnecting
)
=>
{
api
.
listen
.
on
(
'
presencesInitialized
'
,
(
reconnecting
)
=>
{
if
(
!
reconnecting
)
{
_converse
.
registerIntervalHandler
();
}
...
...
@@ -206,7 +207,7 @@ converse.plugins.add('converse-status', {
* @example _converse.api.listen.on('statusInitialized', status => { ... });
* @example _converse.api.waitUntil('statusInitialized').then(() => { ... });
*/
_converse
.
api
.
trigger
(
'
statusInitialized
'
,
reconnecting
);
api
.
trigger
(
'
statusInitialized
'
,
reconnecting
);
}
...
...
@@ -230,15 +231,15 @@ converse.plugins.add('converse-status', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
{
if
(
_converse
.
shouldClearCache
()
&&
_converse
.
xmppstatus
)
{
_converse
.
xmppstatus
.
destroy
();
delete
_converse
.
xmppstatus
;
}
});
_converse
.
api
.
listen
.
on
(
'
connected
'
,
()
=>
initStatus
(
false
));
_converse
.
api
.
listen
.
on
(
'
reconnected
'
,
()
=>
initStatus
(
true
));
api
.
listen
.
on
(
'
connected
'
,
()
=>
initStatus
(
false
));
api
.
listen
.
on
(
'
reconnected
'
,
()
=>
initStatus
(
true
));
/************************ END Event Handlers ************************/
...
...
src/headless/converse-vcard.js
View file @
030c26a8
...
...
@@ -65,8 +65,9 @@ converse.plugins.add('converse-vcard', {
* loaded by converse.js's plugin machinery.
*/
const
{
_converse
}
=
this
;
const
{
api
}
=
_converse
;
_converse
.
api
.
promises
.
add
(
'
VCardsInitialized
'
);
api
.
promises
.
add
(
'
VCardsInitialized
'
);
_converse
.
VCard
=
Model
.
extend
({
...
...
@@ -105,7 +106,7 @@ converse.plugins.add('converse-vcard', {
initialize
()
{
this
.
on
(
'
add
'
,
vcard
=>
{
_converse
.
api
.
vcard
.
update
(
vcard
);
api
.
vcard
.
update
(
vcard
);
});
}
});
...
...
@@ -152,7 +153,7 @@ converse.plugins.add('converse-vcard', {
const
to
=
Strophe
.
getBareJidFromJid
(
jid
)
===
_converse
.
bare_jid
?
null
:
jid
;
let
iq
;
try
{
iq
=
await
_converse
.
api
.
sendIQ
(
createStanza
(
"
get
"
,
to
))
iq
=
await
api
.
sendIQ
(
createStanza
(
"
get
"
,
to
))
}
catch
(
iq
)
{
return
{
'
stanza
'
:
iq
,
...
...
@@ -174,7 +175,7 @@ converse.plugins.add('converse-vcard', {
}
else
{
jid
=
model
.
get
(
'
jid
'
);
}
await
_converse
.
api
.
waitUntil
(
'
VCardsInitialized
'
);
await
api
.
waitUntil
(
'
VCardsInitialized
'
);
model
.
vcard
=
_converse
.
vcards
.
findWhere
({
'
jid
'
:
jid
});
if
(
!
model
.
vcard
)
{
model
.
vcard
=
_converse
.
vcards
.
create
({
'
jid
'
:
jid
});
...
...
@@ -202,7 +203,7 @@ converse.plugins.add('converse-vcard', {
async
function
setVCardOnMUCMessage
(
message
)
{
await
_converse
.
api
.
waitUntil
(
'
VCardsInitialized
'
);
await
api
.
waitUntil
(
'
VCardsInitialized
'
);
if
([
'
error
'
,
'
info
'
].
includes
(
message
.
get
(
'
type
'
)))
{
return
;
}
else
{
...
...
@@ -229,13 +230,13 @@ converse.plugins.add('converse-vcard', {
* Triggered as soon as the `_converse.vcards` collection has been initialized and populated from cache.
* @event _converse#VCardsInitialized
*/
_converse
.
api
.
trigger
(
'
VCardsInitialized
'
);
api
.
trigger
(
'
VCardsInitialized
'
);
}
function
clearVCardsSession
()
{
if
(
_converse
.
shouldClearCache
())
{
_converse
.
api
.
promises
.
add
(
'
VCardsInitialized
'
);
api
.
promises
.
add
(
'
VCardsInitialized
'
);
if
(
_converse
.
vcards
)
{
_converse
.
vcards
.
clearStore
();
delete
_converse
.
vcards
;
...
...
@@ -246,14 +247,14 @@ converse.plugins.add('converse-vcard', {
/************************ BEGIN Event Handlers ************************/
_converse
.
api
.
listen
.
on
(
'
chatBoxInitialized
'
,
m
=>
setVCardOnModel
(
m
));
_converse
.
api
.
listen
.
on
(
'
chatRoomInitialized
'
,
m
=>
setVCardOnModel
(
m
));
_converse
.
api
.
listen
.
on
(
'
chatRoomMessageInitialized
'
,
m
=>
setVCardOnMUCMessage
(
m
));
_converse
.
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
_converse
.
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
VCARD
));
_converse
.
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
clearVCardsSession
());
_converse
.
api
.
listen
.
on
(
'
messageInitialized
'
,
m
=>
setVCardOnModel
(
m
));
_converse
.
api
.
listen
.
on
(
'
rosterContactInitialized
'
,
m
=>
setVCardOnModel
(
m
));
_converse
.
api
.
listen
.
on
(
'
statusInitialized
'
,
_converse
.
initVCardCollection
);
api
.
listen
.
on
(
'
chatBoxInitialized
'
,
m
=>
setVCardOnModel
(
m
));
api
.
listen
.
on
(
'
chatRoomInitialized
'
,
m
=>
setVCardOnModel
(
m
));
api
.
listen
.
on
(
'
chatRoomMessageInitialized
'
,
m
=>
setVCardOnMUCMessage
(
m
));
api
.
listen
.
on
(
'
addClientFeatures
'
,
()
=>
api
.
disco
.
own
.
features
.
add
(
Strophe
.
NS
.
VCARD
));
api
.
listen
.
on
(
'
clearSession
'
,
()
=>
clearVCardsSession
());
api
.
listen
.
on
(
'
messageInitialized
'
,
m
=>
setVCardOnModel
(
m
));
api
.
listen
.
on
(
'
rosterContactInitialized
'
,
m
=>
setVCardOnModel
(
m
));
api
.
listen
.
on
(
'
statusInitialized
'
,
_converse
.
initVCardCollection
);
/************************ BEGIN API ************************/
...
...
@@ -289,7 +290,7 @@ converse.plugins.add('converse-vcard', {
throw
Error
(
"
No jid provided for the VCard data
"
);
}
const
vcard_el
=
Strophe
.
xmlHtmlNode
(
tpl_vcard
(
data
)).
firstElementChild
;
return
_converse
.
api
.
sendIQ
(
createStanza
(
"
set
"
,
jid
,
vcard_el
));
return
api
.
sendIQ
(
createStanza
(
"
set
"
,
jid
,
vcard_el
));
},
/**
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment