social_stream 0.22.1 → 0.23.1
Sign up to get free protection for your applications and to get access to all the features.
- data/base/app/assets/javascripts/activities.js.erb +0 -85
- data/base/app/assets/javascripts/social_stream.comments.js +63 -0
- data/base/app/assets/javascripts/social_stream.objects.js +23 -0
- data/base/app/assets/javascripts/social_stream.timeline.js +37 -10
- data/base/app/assets/javascripts/social_stream.wall.js.erb +135 -118
- data/base/app/assets/stylesheets/cheesecake.css.scss +6 -3
- data/base/app/models/activity_object.rb +18 -0
- data/base/app/models/activity_object_property.rb +5 -0
- data/base/app/views/activities/_new.html.erb +1 -1
- data/base/app/views/activities/_wall.html.erb +1 -1
- data/base/app/views/cheesecake/_cheesecake.html.erb +44 -10
- data/base/app/views/cheesecake/_index.html.erb +18 -130
- data/base/app/views/cheesecake/_sector_form.html.erb +176 -17
- data/base/app/views/comments/_new.html.erb +0 -14
- data/base/app/views/objects/_show.html.erb +6 -0
- data/base/app/views/toolbar/_home.html.erb +1 -1
- data/base/app/views/toolbar/_messages.html.erb +1 -1
- data/base/app/views/toolbar/_profile.html.erb +1 -1
- data/base/config/locales/es.yml +7 -0
- data/base/db/migrate/20120302215722_activity_object_properties.rb +24 -0
- data/base/lib/social_stream/ability/base.rb +2 -2
- data/base/lib/social_stream/base/version.rb +1 -1
- data/documents/app/assets/javascripts/social_stream-documents.js +5 -1
- data/documents/app/models/document.rb +4 -3
- data/documents/app/models/picture.rb +4 -0
- data/documents/lib/social_stream/documents/version.rb +1 -1
- data/documents/social_stream-documents.gemspec +1 -1
- data/events/app/assets/images/poster.png +0 -0
- data/events/app/assets/javascripts/social_stream-events.js +7 -0
- data/events/app/assets/javascripts/social_stream.events.poster.js +21 -0
- data/events/app/assets/stylesheets/events.css.scss +25 -0
- data/events/app/helpers/events_helper.rb +9 -0
- data/events/app/models/activity_object_property/poster.rb +2 -0
- data/events/app/models/event.rb +18 -0
- data/events/app/views/events/_event.html.erb +39 -27
- data/events/app/views/events/_form_poster.html.erb +8 -0
- data/events/app/views/events/edit.js.erb +5 -0
- data/events/config/locales/en.yml +2 -0
- data/events/config/locales/es.yml +2 -0
- data/events/lib/social_stream-events.rb +2 -1
- data/events/lib/social_stream/events/engine.rb +6 -0
- data/events/lib/social_stream/events/models/document.rb +26 -0
- data/events/lib/social_stream/events/version.rb +1 -1
- data/events/social_stream-events.gemspec +1 -1
- data/lib/social_stream/version.rb +1 -1
- data/linkser/lib/social_stream/linkser/version.rb +1 -1
- data/linkser/social_stream-linkser.gemspec +1 -1
- data/presence/app/assets/images/games/ter/classic_aspa.png +0 -0
- data/presence/app/assets/images/games/ter/classic_board.png +0 -0
- data/presence/app/assets/images/games/ter/classic_circle.png +0 -0
- data/presence/app/assets/images/games/ter/modern_aspa.png +0 -0
- data/presence/app/assets/images/games/ter/modern_board.png +0 -0
- data/presence/app/assets/images/games/ter/modern_circle.png +0 -0
- data/presence/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +34 -3
- data/presence/app/assets/javascripts/presence.js.erb +4 -0
- data/presence/app/assets/javascripts/{xmpp_client_management.js.erb → presence_XmppClient.js.erb} +417 -49
- data/presence/app/assets/javascripts/{chat_audio.js.erb → presence_audio.js.erb} +0 -0
- data/presence/app/assets/javascripts/presence_game.js.erb +76 -0
- data/presence/app/assets/javascripts/presence_game_ter.js.erb +384 -0
- data/presence/app/assets/javascripts/presence_notifications.js +191 -0
- data/presence/app/assets/javascripts/{chat_parser.js → presence_parser.js} +0 -0
- data/presence/app/assets/javascripts/{chat_persistence.js → presence_persistence.js} +84 -70
- data/presence/app/assets/javascripts/{store.js → presence_store.js} +0 -0
- data/presence/app/assets/javascripts/{chat_interface_manager.js.erb → presence_uiManager.js.erb} +42 -132
- data/presence/app/assets/javascripts/{chat_utilities.js → presence_utilities.js} +10 -34
- data/presence/app/assets/javascripts/{videochat.js.erb → presence_videochat.js.erb} +4 -24
- data/presence/app/assets/javascripts/{chat_window_manager.js → presence_windowManager.js} +275 -217
- data/presence/app/assets/javascripts/social_stream-presence.js +0 -2
- data/presence/app/assets/stylesheets/chat.css.scss +12 -1
- data/presence/app/views/chat/_contacts.html.erb +5 -5
- data/presence/app/views/chat/_index.html.erb +10 -2
- data/presence/config/locales/en.yml +9 -1
- data/presence/config/locales/es.yml +9 -1
- data/presence/ejabberd/ejabberd_files.zip +0 -0
- data/presence/ejabberd/ejabberd_scripts/emanagement +132 -2
- data/presence/ejabberd/installer.sh +1 -0
- data/presence/ejabberd/mod_muc_admin/mod_muc_admin.beam +0 -0
- data/presence/ejabberd/mod_muc_admin/mod_muc_admin.erl +871 -0
- data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
- data/presence/lib/social_stream/presence/models/buddy_manager.rb +32 -26
- data/presence/lib/social_stream/presence/models/group_manager.rb +12 -2
- data/presence/lib/social_stream/presence/version.rb +1 -1
- data/presence/lib/social_stream/presence/xmpp_server_order.rb +2 -2
- data/presence/social_stream-presence.gemspec +1 -1
- data/presence/vendor/assets/javascripts/strophe.muc.js +1 -1
- data/social_stream.gemspec +5 -5
- metadata +63 -41
- data/events/app/assets/javascripts/0_init.js +0 -4
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.files = `git ls-files`.split("\n")
|
13
13
|
|
14
14
|
# Gem dependencies
|
15
|
-
s.add_runtime_dependency('social_stream-base', '~> 0.
|
15
|
+
s.add_runtime_dependency('social_stream-base', '~> 0.17.0')
|
16
16
|
s.add_runtime_dependency('rails-scheduler', '~> 0.0.6')
|
17
17
|
s.add_runtime_dependency('coffee-rails', '>= 3.1.0')
|
18
18
|
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.files = `git ls-files`.split("\n")
|
13
13
|
|
14
14
|
# Gem dependencies
|
15
|
-
s.add_runtime_dependency('social_stream-base', '~> 0.
|
15
|
+
s.add_runtime_dependency('social_stream-base', '~> 0.17.0')
|
16
16
|
s.add_runtime_dependency('linkser', '~> 0.0.10')
|
17
17
|
# Development Gem dependencies
|
18
18
|
s.add_development_dependency('sqlite3-ruby')
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -23,6 +23,7 @@
|
|
23
23
|
offset: 0, // relative to right edge of the browser window
|
24
24
|
width: 230, // width of the chatbox
|
25
25
|
height: 400, // height of the chatbox
|
26
|
+
groupBox: false, //if a group Chatbox?
|
26
27
|
video: 0, // height of the videoBox
|
27
28
|
messageSent: function(id, user, msg){
|
28
29
|
// override this
|
@@ -39,7 +40,12 @@
|
|
39
40
|
var self = this;
|
40
41
|
var box = self.elem.uiChatboxLog;
|
41
42
|
var e = document.createElement('div');
|
42
|
-
|
43
|
+
if((peer==null)||($(peer).html()=="")){
|
44
|
+
var fContent = msg
|
45
|
+
} else {
|
46
|
+
var fContent = "<b>" + peer +":</b> " + msg
|
47
|
+
}
|
48
|
+
$(e).html(fContent)
|
43
49
|
.addClass("ui-chatbox-msg");
|
44
50
|
box.append(e);
|
45
51
|
self._scrollToBottom();
|
@@ -208,6 +214,25 @@
|
|
208
214
|
.appendTo(uiChatboxTitlebarVideoChange),
|
209
215
|
|
210
216
|
|
217
|
+
//Games Menu button
|
218
|
+
uiChatboxTitlebarGames = (self.uiChatboxTitlebarGames = $('<a href="#"></a>'))
|
219
|
+
.addClass('ui-corner-all ' +
|
220
|
+
'ui-chatbox-icon' + ' ui-games-icon'
|
221
|
+
)
|
222
|
+
.attr('role', 'button')
|
223
|
+
.hover(function() {uiChatboxTitlebarGames.addClass('ui-state-hover');},
|
224
|
+
function() {uiChatboxTitlebarGames.removeClass('ui-state-hover');})
|
225
|
+
.click(function(event) {
|
226
|
+
pickGamesButton(self)
|
227
|
+
return false;
|
228
|
+
})
|
229
|
+
.appendTo(uiChatboxTitlebar),
|
230
|
+
uiChatboxTitlebarGamesText = $('<span></span>')
|
231
|
+
.addClass('ui-icon-star ' + 'chat-thick ' + ' chat-gamesthick' )
|
232
|
+
.text('')
|
233
|
+
.appendTo(uiChatboxTitlebarGames),
|
234
|
+
|
235
|
+
|
211
236
|
// content
|
212
237
|
uiChatboxContent = (self.uiChatboxContent = $('<div></div>'))
|
213
238
|
.addClass('ui-widget-content ' +
|
@@ -222,8 +247,7 @@
|
|
222
247
|
'ui-chatbox-notify'
|
223
248
|
)
|
224
249
|
.click(function(event) {
|
225
|
-
|
226
|
-
self.uiChatboxNotify.fadeOut();
|
250
|
+
onClickChatNotification(self.uiChatboxNotify)
|
227
251
|
})
|
228
252
|
.appendTo(uiChatboxContent),
|
229
253
|
|
@@ -328,6 +352,9 @@
|
|
328
352
|
break;
|
329
353
|
case "video":
|
330
354
|
this._setVideo(value);
|
355
|
+
break;
|
356
|
+
case "groupBox":
|
357
|
+
this._setGroupBox(value);
|
331
358
|
break;
|
332
359
|
}
|
333
360
|
}
|
@@ -346,6 +373,10 @@
|
|
346
373
|
this.uiChatboxLog.height(height + "px");
|
347
374
|
},
|
348
375
|
|
376
|
+
_setGroupBox: function(groupBox) {
|
377
|
+
this.uiChatboxLog.groupBox(groupBox);
|
378
|
+
},
|
379
|
+
|
349
380
|
_setVideo: function(videoHeight) {
|
350
381
|
this.uiVideobox.height(videoHeight + "px");
|
351
382
|
if (videoHeight==0){
|
data/presence/app/assets/javascripts/{xmpp_client_management.js.erb → presence_XmppClient.js.erb}
RENAMED
@@ -33,7 +33,7 @@ statusIcons['away'] = "away";
|
|
33
33
|
statusIcons['xa'] = "away";
|
34
34
|
statusIcons['dnd'] = "dnd";
|
35
35
|
|
36
|
-
//
|
36
|
+
//Contacts information
|
37
37
|
var contactsInfo = new Array();
|
38
38
|
//contactsInfo['slug'] = "[Object chatContact]";
|
39
39
|
|
@@ -43,6 +43,8 @@ function chatContact(domain,resource,client,version) {
|
|
43
43
|
this.resource=resource
|
44
44
|
this.client=client;
|
45
45
|
this.version=version;
|
46
|
+
|
47
|
+
//Videochat params
|
46
48
|
//Sender: disconnected, negotiating , connecting , waiting, establishing, connected
|
47
49
|
//Receiver: disconnected , pending , establishing, connected
|
48
50
|
this.videoChatStatus = "disconnected";
|
@@ -53,6 +55,19 @@ function chatContact(domain,resource,client,version) {
|
|
53
55
|
this.publisher=null;
|
54
56
|
}
|
55
57
|
|
58
|
+
//Rooms information
|
59
|
+
var roomsInfo = new Array();
|
60
|
+
//roomsInfo['groupSlug'] = "[Object chatRoom]";
|
61
|
+
|
62
|
+
//Manage room information
|
63
|
+
function chatRoom() {
|
64
|
+
this.occupants=[];
|
65
|
+
this.joined = false;
|
66
|
+
this.affiliation = "none";
|
67
|
+
this.role = "none";
|
68
|
+
this.nick = getBaseNickFromUserName();
|
69
|
+
}
|
70
|
+
|
56
71
|
|
57
72
|
//IQsIDs
|
58
73
|
var iqStanzaID = new Array();
|
@@ -60,6 +75,8 @@ iqStanzaID['cinfo'] = "versionID";
|
|
60
75
|
iqStanzaID['videochatRequest'] = "videochatRequestID";
|
61
76
|
iqStanzaID['videochatRequestCancel'] = "videochatRequestCancelID";
|
62
77
|
|
78
|
+
|
79
|
+
|
63
80
|
////////////////////
|
64
81
|
//Connect functions
|
65
82
|
////////////////////
|
@@ -67,7 +84,6 @@ iqStanzaID['videochatRequestCancel'] = "videochatRequestCancelID";
|
|
67
84
|
function connectToChat(user_jid,cookie,password){
|
68
85
|
|
69
86
|
if (isUserConnected()){
|
70
|
-
log("USer already connected")
|
71
87
|
return true;
|
72
88
|
}
|
73
89
|
|
@@ -82,7 +98,6 @@ function connectToChat(user_jid,cookie,password){
|
|
82
98
|
}
|
83
99
|
}
|
84
100
|
|
85
|
-
|
86
101
|
function isStropheConnected(){
|
87
102
|
if((strophe_connection!=null)&&(strophe_connection.connected)){
|
88
103
|
return true;
|
@@ -106,7 +121,6 @@ function connectToServerWithCookie(user_jid, cookie){
|
|
106
121
|
return true;
|
107
122
|
}
|
108
123
|
|
109
|
-
|
110
124
|
//Password: Get from chatPassword param if exists, instead try to get from sessionStorage.
|
111
125
|
function connectToServerWithPassword(user_jid, chatPassword){
|
112
126
|
|
@@ -224,7 +238,8 @@ function onConnect(status) {
|
|
224
238
|
log('Strophe is disconnected.');
|
225
239
|
disconnectionFlag = true;
|
226
240
|
clearTimeout(awayTimer);
|
227
|
-
|
241
|
+
updateInterfaceAfterUserDisconnect();
|
242
|
+
updateRoomsInfoAfterUserDisconnect();
|
228
243
|
reconnectTimer = setTimeout ("onReconnect()", 5000);
|
229
244
|
} else if (status == Strophe.Status.CONNECTED) {
|
230
245
|
//AFTER CONNECT ACTIONS
|
@@ -234,7 +249,8 @@ function onConnect(status) {
|
|
234
249
|
clearTimeout(reconnectTimer);
|
235
250
|
|
236
251
|
//addHandler:(callback, namespace to match, stanza name, stanza type, stanza id , stanza from, options)
|
237
|
-
strophe_connection.addHandler(onMessage, null, 'message',
|
252
|
+
strophe_connection.addHandler(onMessage, null, 'message', 'chat', null, null);
|
253
|
+
strophe_connection.addHandler(onRoomMessage, null, 'message', 'groupchat', null, null);
|
238
254
|
strophe_connection.addHandler(onPresence, null, 'presence', null, null, null);
|
239
255
|
strophe_connection.addHandler(onIQStanza,null, "iq", null, null);
|
240
256
|
|
@@ -274,7 +290,6 @@ function onReconnect(){
|
|
274
290
|
}
|
275
291
|
}
|
276
292
|
|
277
|
-
|
278
293
|
function disconnectStrophe(){
|
279
294
|
userStatus = "offline";
|
280
295
|
setStatusWidgetTitle("offline");
|
@@ -289,18 +304,24 @@ function disconnectStrophe(){
|
|
289
304
|
////////
|
290
305
|
//Manage Message stanzas
|
291
306
|
///////
|
307
|
+
|
308
|
+
//Chat messages handler
|
292
309
|
function onMessage(msg) {
|
293
|
-
var to = msg.getAttribute('to');
|
294
310
|
var from = msg.getAttribute('from');
|
295
311
|
var type = msg.getAttribute('type');
|
296
312
|
var elems = msg.getElementsByTagName('body');
|
297
313
|
|
298
314
|
if (type == "chat" && elems.length > 0) {
|
299
315
|
var body = elems[0];
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
316
|
+
var msg = Strophe.getText(body);
|
317
|
+
var from_slug = getSlugFromJid(from)
|
318
|
+
|
319
|
+
if(isChatRoomJid(from)){
|
320
|
+
return true
|
321
|
+
} else {
|
322
|
+
var from_slug = getSlugFromJid(from)
|
323
|
+
afterReceivedChatMessage(from_slug,msg,null)
|
324
|
+
}
|
304
325
|
}
|
305
326
|
|
306
327
|
// we must return true to keep the handler alive.
|
@@ -313,35 +334,38 @@ function onMessage(msg) {
|
|
313
334
|
//Manage Presence stanzas
|
314
335
|
///////
|
315
336
|
function onPresence(presence) {
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
switch (ptype){
|
323
|
-
case undefined:
|
324
|
-
processAvailablePresenceStanza(presence)
|
325
|
-
break;
|
326
|
-
case "available":
|
327
|
-
processAvailablePresenceStanza(presence)
|
328
|
-
break;
|
329
|
-
case "unavailable":
|
330
|
-
processUnavailablePresenceStanza(presence)
|
331
|
-
break;
|
332
|
-
default :
|
333
|
-
//Stanza type not recognize
|
334
|
-
processAvailablePresenceStanza(presence)
|
335
|
-
}
|
336
|
-
|
337
|
-
return true;
|
338
|
-
}
|
337
|
+
if (isChatRoomJid($(presence).attr('from'))){
|
338
|
+
return onRoomPresence(presence);
|
339
|
+
} else {
|
340
|
+
return onBuddyPresence(presence);
|
341
|
+
}
|
342
|
+
}
|
339
343
|
|
344
|
+
function onBuddyPresence(presence){
|
345
|
+
var ptype = $(presence).attr('type');
|
346
|
+
|
347
|
+
switch (ptype){
|
348
|
+
case undefined:
|
349
|
+
processAvailablePresenceStanza(presence)
|
350
|
+
break;
|
351
|
+
case "available":
|
352
|
+
processAvailablePresenceStanza(presence)
|
353
|
+
break;
|
354
|
+
case "unavailable":
|
355
|
+
processUnavailablePresenceStanza(presence)
|
356
|
+
break;
|
357
|
+
default :
|
358
|
+
//Stanza type not recognize
|
359
|
+
processAvailablePresenceStanza(presence)
|
360
|
+
}
|
361
|
+
|
362
|
+
return true;
|
363
|
+
}
|
340
364
|
|
341
365
|
function processAvailablePresenceStanza(presence){
|
342
366
|
var from = $(presence).attr('from');
|
343
367
|
var slug = from.split("@")[0];
|
344
|
-
|
368
|
+
|
345
369
|
if (slug != user_slug) {
|
346
370
|
storeContactInformation(presence);
|
347
371
|
if (getConnectionBoxFromSlug(slug)!=null){
|
@@ -359,7 +383,7 @@ function processAvailablePresenceStanza(presence){
|
|
359
383
|
function processUnavailablePresenceStanza(presence){
|
360
384
|
var from = $(presence).attr('from');
|
361
385
|
var slug = from.split("@")[0];
|
362
|
-
|
386
|
+
|
363
387
|
if (slug != user_slug) {
|
364
388
|
if (getConnectionBoxFromSlug(slug)!=null){
|
365
389
|
updateInterfaceAfterPresenceStanza(slug,false)
|
@@ -383,6 +407,12 @@ function storeContactInformation(stanza){
|
|
383
407
|
}
|
384
408
|
}
|
385
409
|
|
410
|
+
function storeRoomInformation(roomName){
|
411
|
+
if (!(roomName in roomsInfo)) {
|
412
|
+
var room = new chatRoom();
|
413
|
+
roomsInfo[roomName]=room;
|
414
|
+
}
|
415
|
+
}
|
386
416
|
|
387
417
|
|
388
418
|
////////
|
@@ -404,7 +434,7 @@ function onIQStanza(iq){
|
|
404
434
|
if(type=="get"){
|
405
435
|
return handleGetIQStanza(iq,from,slug);
|
406
436
|
} else if(type="result"){
|
407
|
-
return handleResultIQStanza(iq,from,slug)
|
437
|
+
return handleResultIQStanza(iq,from,slug);
|
408
438
|
}
|
409
439
|
|
410
440
|
return true;
|
@@ -437,7 +467,7 @@ function handleGetIQStanza(iq,jid,slug){
|
|
437
467
|
|
438
468
|
//Case 2: Request videochat
|
439
469
|
if(iqID==iqStanzaID['videochatRequest']){
|
440
|
-
handleGetVideochatIQStanza(jid,iqID,iq,slug)
|
470
|
+
handleGetVideochatIQStanza(jid,iqID,iq,slug);
|
441
471
|
return true;
|
442
472
|
}
|
443
473
|
|
@@ -447,8 +477,6 @@ function handleGetIQStanza(iq,jid,slug){
|
|
447
477
|
return true;
|
448
478
|
}
|
449
479
|
|
450
|
-
|
451
|
-
|
452
480
|
function handleGetVideochatIQStanza(jid,iqID,iq,slug){
|
453
481
|
storeContactInformation(iq);
|
454
482
|
var queryTag = iq.getElementsByTagName('query');
|
@@ -477,7 +505,6 @@ function handleGetVideochatIQStanza(jid,iqID,iq,slug){
|
|
477
505
|
function handleResultIQStanza(iq,jid,slug){
|
478
506
|
var iqID = iq.getAttribute("id");
|
479
507
|
|
480
|
-
|
481
508
|
if (iqID==iqStanzaID['cinfo']){
|
482
509
|
return handleIQResultWithClientInfo(iq,slug);
|
483
510
|
}
|
@@ -588,7 +615,6 @@ function sendIQStanzaToRequestVideochat(slug){
|
|
588
615
|
}
|
589
616
|
|
590
617
|
|
591
|
-
|
592
618
|
///////
|
593
619
|
//SEND STANZAS: RESULT
|
594
620
|
///////
|
@@ -636,11 +662,24 @@ function sendIQStanzaToCancelVideochat(slug){
|
|
636
662
|
}
|
637
663
|
|
638
664
|
|
639
|
-
|
640
665
|
////////
|
641
666
|
//Send Message stanzas
|
642
667
|
///////
|
643
|
-
function sendChatMessage(
|
668
|
+
function sendChatMessage(guest_slug,msg){
|
669
|
+
rotatePriority(guest_slug);
|
670
|
+
if (isSlugGroup(guest_slug)){
|
671
|
+
var guest_jid = getRoomJidFromRoomName(guest_slug)
|
672
|
+
return sendGroupMessageToRoom(guest_jid,msg);
|
673
|
+
} else {
|
674
|
+
var headerMessage = getParsedName(user_name,true);
|
675
|
+
getChatBoxForSlug(guest_slug).chatbox("option", "boxManager").addMsg(headerMessage, getParsedContent(msg,true));
|
676
|
+
var guest_jid = getJidFromSlug(guest_slug)
|
677
|
+
return sendChatMessageToBuddy(guest_jid,msg);
|
678
|
+
}
|
679
|
+
}
|
680
|
+
|
681
|
+
function sendChatMessageToBuddy(to,text){
|
682
|
+
var from = user_jid
|
644
683
|
var type = "chat";
|
645
684
|
var body= $build("body");
|
646
685
|
body.t(text);
|
@@ -673,13 +712,342 @@ function sendStatus(status){
|
|
673
712
|
}
|
674
713
|
|
675
714
|
|
676
|
-
|
677
715
|
////////
|
678
716
|
//MUC management
|
679
717
|
///////
|
680
718
|
|
719
|
+
var muc_host = "conference";
|
720
|
+
|
681
721
|
function joinRoom(roomName){
|
682
|
-
|
683
|
-
|
684
|
-
|
722
|
+
return strophe_connection.muc.join(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null, null, null)
|
723
|
+
}
|
724
|
+
|
725
|
+
function leaveRoom(roomName){
|
726
|
+
return strophe_connection.muc.leave(getRoomJidFromRoomName(roomName), getRoomNickForRoom(roomName), null, null)
|
727
|
+
}
|
728
|
+
|
729
|
+
function sendGroupMessageToRoomWithName(roomName,msg){
|
730
|
+
return sendMessageToRoom(getRoomJidFromRoomName(roomName),msg)
|
731
|
+
}
|
732
|
+
|
733
|
+
function sendGroupMessageToRoom(roomJid,msg){
|
734
|
+
return strophe_connection.muc.message(roomJid, null, msg, null, "groupchat")
|
735
|
+
}
|
736
|
+
|
737
|
+
function sendPrivateMessageToRoomUser(roomName,userNick,msg){
|
738
|
+
return strophe_connection.muc.message(getRoomJidFromRoomName(roomName), userNick, msg, null, "chat")
|
739
|
+
}
|
740
|
+
|
741
|
+
function queryChatRoomOccupants(roomName){
|
742
|
+
return strophe_connection.muc.queryOccupants(getRoomJidFromRoomName(roomName), queryChatRoomOccupantsSuccess, queryChatRoomOccupantsFail)
|
743
|
+
}
|
744
|
+
|
745
|
+
function queryChatRoomOccupantsSuccess(iqResponse){
|
746
|
+
handleIQResultFromMucOccupantsRequest(iqResponse);
|
747
|
+
return true;
|
748
|
+
}
|
749
|
+
|
750
|
+
function queryChatRoomOccupantsFail(){
|
751
|
+
return true;
|
752
|
+
}
|
753
|
+
|
754
|
+
function handleIQResultFromMucOccupantsRequest(iq){
|
755
|
+
var from = $(iq).attr('from');
|
756
|
+
var room_slug = getSlugFromJid(from)
|
757
|
+
var queryTag = iq.getElementsByTagName('query');
|
758
|
+
|
759
|
+
if (queryTag.length > 0) {
|
760
|
+
var queryElement = queryTag[0];
|
761
|
+
var occupants = queryElement.getElementsByTagName('item');
|
762
|
+
$.each(occupants, function(index, value) {
|
763
|
+
//List all occupants
|
764
|
+
var nick = $(value).attr("name");
|
765
|
+
if(roomsInfo[room_slug].occupants.indexOf(nick)==-1){
|
766
|
+
roomsInfo[room_slug].occupants.push(nick)
|
767
|
+
}
|
768
|
+
});
|
769
|
+
}
|
770
|
+
}
|
771
|
+
|
772
|
+
function accessRoom(roomName,open){
|
773
|
+
storeRoomInformation(roomName)
|
774
|
+
if(roomsInfo[roomName].joined==false){
|
775
|
+
joinRoom(roomName)
|
776
|
+
queryChatRoomOccupants(roomName)
|
777
|
+
}
|
778
|
+
if(!existsSlugChatBox(roomName)){
|
779
|
+
createGroupChatBox(roomName,open)
|
780
|
+
}
|
781
|
+
return true
|
782
|
+
}
|
783
|
+
|
784
|
+
function resetRoomConfig(roomName){
|
785
|
+
storeRoomInformation(roomName)
|
786
|
+
var room = new chatRoom()
|
787
|
+
roomsInfo[roomName]=room
|
788
|
+
}
|
789
|
+
|
790
|
+
function updateRoomsInfoAfterUserDisconnect(){
|
791
|
+
$.each(getAllSlugsWithVisibleGroupBoxes(), function(index, value) {
|
792
|
+
resetRoomConfig(value)
|
793
|
+
initialNotificationInGroup(value,I18n.t('chat.muc.offline'))
|
794
|
+
});
|
795
|
+
}
|
796
|
+
|
797
|
+
function getRoomJidFromRoomName(roomName){
|
798
|
+
return roomName + "@" + muc_host + "." + domain;
|
799
|
+
}
|
800
|
+
|
801
|
+
function getRoomNickForRoom(roomName){
|
802
|
+
if(roomName in roomsInfo){
|
803
|
+
return roomsInfo[roomName].nick;
|
804
|
+
} else {
|
805
|
+
return getBaseNickFromUserName();
|
806
|
+
}
|
807
|
+
}
|
808
|
+
|
809
|
+
function getBaseNickFromUserName(){
|
810
|
+
return user_name.split(" ")[0];
|
811
|
+
}
|
812
|
+
|
813
|
+
function changeRoomNickNameAndJoinAgain(roomName){
|
814
|
+
var old_nick = getRoomNickForRoom(roomName)
|
815
|
+
|
816
|
+
if(old_nick.split("_").length > 4){
|
817
|
+
//Bucle prevention...
|
818
|
+
return false;
|
819
|
+
}
|
820
|
+
|
821
|
+
storeRoomInformation(roomName)
|
822
|
+
roomsInfo[roomName].nick = old_nick + "_"
|
823
|
+
joinRoom(roomName)
|
824
|
+
return true;
|
825
|
+
}
|
826
|
+
|
827
|
+
|
828
|
+
////////
|
829
|
+
//MUC Stanzas
|
830
|
+
///////
|
831
|
+
|
832
|
+
//MUC Messages
|
833
|
+
function onRoomMessage(msg) {
|
834
|
+
//from=roomSlug@conference.domain/from_slug
|
835
|
+
var from = msg.getAttribute('from');
|
836
|
+
var type = msg.getAttribute('type');
|
837
|
+
var elems = msg.getElementsByTagName('body');
|
838
|
+
|
839
|
+
if (type == "groupchat" && elems.length > 0) {
|
840
|
+
var body = elems[0];
|
841
|
+
var user_nick = getNickFromChatRoomJid(from)
|
842
|
+
var msg = Strophe.getText(body);
|
843
|
+
afterReceivedGroupChatMessage(from,msg)
|
844
|
+
}
|
845
|
+
return true;
|
846
|
+
}
|
847
|
+
|
848
|
+
|
849
|
+
//MUC Presence stanzas
|
850
|
+
function onRoomPresence(presence) {
|
851
|
+
var from = $(presence).attr('from');
|
852
|
+
var to = $(presence).attr('to')
|
853
|
+
var room_slug = getSlugFromJid(from);
|
854
|
+
var nick = getNickFromChatRoomJid(from)
|
855
|
+
var ptype = $(presence).attr('type')
|
856
|
+
|
857
|
+
//Join or Leave room stanzas of self user
|
858
|
+
if((nick == getRoomNickForRoom(room_slug))&&(getSlugFromJid(to) == user_slug)){
|
859
|
+
switch (ptype){
|
860
|
+
case undefined:
|
861
|
+
processJoinRoomPresenceStanza(presence);
|
862
|
+
break;
|
863
|
+
case "available":
|
864
|
+
processJoinRoomPresenceStanza(presence);
|
865
|
+
break;
|
866
|
+
case "unavailable":
|
867
|
+
processLeaveRoomPresenceStanza(presence);
|
868
|
+
break;
|
869
|
+
case "error":
|
870
|
+
processJoinErrorRoomPresenceStanza(presence);
|
871
|
+
break;
|
872
|
+
}
|
873
|
+
return true;
|
874
|
+
}
|
875
|
+
|
876
|
+
|
877
|
+
//Rest of stanzas
|
878
|
+
switch (ptype){
|
879
|
+
case undefined:
|
880
|
+
processAvailableRoomPresenceStanza(presence)
|
881
|
+
break;
|
882
|
+
case "available":
|
883
|
+
processAvailableRoomPresenceStanza(presence)
|
884
|
+
break;
|
885
|
+
case "unavailable":
|
886
|
+
processUnavailableRoomPresenceStanza(presence)
|
887
|
+
break;
|
888
|
+
default :
|
889
|
+
//Stanza type not recognize
|
890
|
+
return true
|
891
|
+
}
|
892
|
+
|
893
|
+
return true
|
894
|
+
}
|
895
|
+
|
896
|
+
|
897
|
+
function processJoinRoomPresenceStanza(presence){
|
898
|
+
var from = $(presence).attr('from');
|
899
|
+
var room_slug = getSlugFromJid(from);
|
900
|
+
storeRoomInformation(room_slug);
|
901
|
+
|
902
|
+
var xElements = presence.getElementsByTagName('x');
|
903
|
+
|
904
|
+
if (xElements.length == 1) {
|
905
|
+
var xElement = xElements[0];
|
906
|
+
var items = xElement.getElementsByTagName('item');
|
907
|
+
|
908
|
+
$.each(items, function(index, value) {
|
909
|
+
var role = $(value).attr("role")
|
910
|
+
var affiliation = $(value).attr("affiliation")
|
911
|
+
|
912
|
+
roomsInfo[room_slug].affiliation = affiliation
|
913
|
+
roomsInfo[room_slug].role = role
|
914
|
+
if(roomsInfo[room_slug].joined == false){
|
915
|
+
roomsInfo[room_slug].joined = true
|
916
|
+
changeInitialNotificationInGroup(room_slug,I18n.t('chat.muc.occupants'))
|
917
|
+
}
|
918
|
+
});
|
919
|
+
}
|
920
|
+
}
|
921
|
+
|
922
|
+
function processLeaveRoomPresenceStanza(presence){
|
923
|
+
var from = $(presence).attr('from');
|
924
|
+
var room_slug = getSlugFromJid(from);
|
925
|
+
resetRoomConfig(room_slug)
|
926
|
+
changeInitialNotificationInGroup(room_slug,"")
|
927
|
+
}
|
928
|
+
|
929
|
+
function processJoinErrorRoomPresenceStanza(presence){
|
930
|
+
var from = $(presence).attr('from')
|
931
|
+
var room_slug = getSlugFromJid(from)
|
932
|
+
var errorMsg = "Error";
|
933
|
+
|
934
|
+
var eElements = presence.getElementsByTagName('error')
|
935
|
+
if (eElements.length == 1) {
|
936
|
+
var error = eElements[0];
|
937
|
+
var code = $(error).attr("code")
|
938
|
+
var type = $(error).attr("type")
|
939
|
+
errorMsg = errorMsg + " with code:" + code + " and type:" + type
|
940
|
+
var textElements = error.getElementsByTagName('text')
|
941
|
+
if (textElements.length == 1) {
|
942
|
+
var text = $(textElements[0]).text()
|
943
|
+
errorMsg = errorMsg + "\n" + text
|
944
|
+
}
|
945
|
+
|
946
|
+
//Try to fix errors!
|
947
|
+
if(code==409){
|
948
|
+
//Case: Nickname already in use
|
949
|
+
if (changeRoomNickNameAndJoinAgain(room_slug)){
|
950
|
+
return;
|
951
|
+
}
|
952
|
+
}
|
953
|
+
//if(code==403){
|
954
|
+
//Case: Auth Denied
|
955
|
+
//}
|
956
|
+
|
957
|
+
//[...]
|
958
|
+
|
959
|
+
}
|
960
|
+
|
961
|
+
resetRoomConfig(room_slug)
|
962
|
+
initialNotificationInGroup(room_slug,I18n.t("chat.muc.joinError", {errorMsg: errorMsg}))
|
963
|
+
}
|
964
|
+
|
965
|
+
function processAvailableRoomPresenceStanza(presence){
|
966
|
+
var from = $(presence).attr('from');
|
967
|
+
var nick = getNickFromChatRoomJid(from)
|
968
|
+
var room_slug = getSlugFromJid(from)
|
969
|
+
storeRoomInformation(room_slug);
|
970
|
+
|
971
|
+
if (roomsInfo[room_slug].occupants.indexOf(nick)==-1){
|
972
|
+
roomsInfo[room_slug].occupants.push(nick)
|
973
|
+
addNickToNotificationInGroup(room_slug,nick)
|
974
|
+
writeReceivedMessageOnChatWindow("",room_slug, I18n.t("chat.muc.join", {nick: nick}))
|
975
|
+
}
|
976
|
+
}
|
977
|
+
|
978
|
+
function processUnavailableRoomPresenceStanza(presence){
|
979
|
+
var from = $(presence).attr('from');
|
980
|
+
var nick = getNickFromChatRoomJid(from)
|
981
|
+
var room_slug = getSlugFromJid(from)
|
982
|
+
storeRoomInformation(room_slug);
|
983
|
+
|
984
|
+
if (roomsInfo[room_slug].occupants.indexOf(nick)!=-1){
|
985
|
+
roomsInfo[room_slug].occupants.splice(roomsInfo[room_slug].occupants.indexOf(nick),1)
|
986
|
+
removeNickFromNotificationInGroup(room_slug,nick)
|
987
|
+
writeReceivedMessageOnChatWindow("",room_slug,I18n.t("chat.muc.leave", {nick: nick}))
|
988
|
+
}
|
989
|
+
}
|
990
|
+
|
991
|
+
|
992
|
+
|
993
|
+
//////////////////
|
994
|
+
// Getters
|
995
|
+
//////////////////
|
996
|
+
function getSlugFromJid(jid){
|
997
|
+
return jid.split("@")[0];
|
998
|
+
}
|
999
|
+
|
1000
|
+
function getDomainFromJid(jid){
|
1001
|
+
return jid.split("@")[1].split("/")[0];
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
function isChatRoomJid(jid){
|
1005
|
+
if ((getDomainFromJid(jid).split(".")[0])==muc_host){
|
1006
|
+
return true;
|
1007
|
+
}
|
1008
|
+
return false;
|
1009
|
+
}
|
1010
|
+
|
1011
|
+
function getNameFromSlug(slug){
|
1012
|
+
var connectionBox = getConnectionBoxFromSlug(slug);
|
1013
|
+
|
1014
|
+
if(connectionBox!=null){
|
1015
|
+
return $(connectionBox).attr("name");
|
1016
|
+
}
|
1017
|
+
|
1018
|
+
var chatBox = getChatBoxForSlug(slug)
|
1019
|
+
if(chatBox!=null){
|
1020
|
+
return chatBox.attr("name");
|
1021
|
+
}
|
1022
|
+
|
1023
|
+
//return rebuildNameFromSlug(slug)
|
1024
|
+
return slug;
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
function rebuildNameFromSlug(slug){
|
1028
|
+
var cname = slug.split("-");
|
1029
|
+
var name = "";
|
1030
|
+
for(i=0; i<cname.length; i++){
|
1031
|
+
if (i!=0){
|
1032
|
+
name = name + " ";
|
1033
|
+
}
|
1034
|
+
name = name + cname[i][0].toUpperCase() + cname[i].substring(1,cname[i].length);
|
1035
|
+
}
|
1036
|
+
return name;
|
1037
|
+
}
|
1038
|
+
|
1039
|
+
function getNameFromJid(){
|
1040
|
+
return getNameFromSlug(getSlugFromJid(jid));
|
1041
|
+
}
|
1042
|
+
|
1043
|
+
function getJidFromSlug(slug){
|
1044
|
+
return slug + "@" + domain;
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
function getNickFromChatRoomJid(jid){
|
1048
|
+
return jid.split("/")[1];
|
1049
|
+
}
|
1050
|
+
|
1051
|
+
function purgeNickFromChatRoomJid(jid){
|
1052
|
+
return jid.split("/")[0];
|
685
1053
|
}
|