... | ... |
@@ -28,9 +28,9 @@ this.App = |
28 | 28 |
newContact = new Xmpp.Models.Contact( |
29 | 29 |
id: contact.jid |
30 | 30 |
jid: contact.jid |
31 |
- belongsTo: contact.belongsTo |
|
31 |
+ belongsTo: [contact.belongsTo] |
|
32 | 32 |
) |
33 |
- App.Collections.contacts.add newContact |
|
33 |
+ App.Collections.contacts.add(newContact, merge: true) |
|
34 | 34 |
) |
35 | 35 |
) |
36 | 36 |
|
... | ... |
@@ -53,6 +53,9 @@ this.App = |
53 | 53 |
) |
54 | 54 |
) |
55 | 55 |
|
56 |
+ removeContactRemote: (contact, client) -> |
|
57 |
+ App.Com.trigger(event: 'app.roster.removeContact', data: {jid: contact, client: client}) |
|
58 |
+ |
|
56 | 59 |
_setupBackboneComponents: -> |
57 | 60 |
App.Collections.contacts = new Xmpp.Collections.ContactsCollection() |
58 | 61 |
App.Collections.chats = new Xmpp.Collections.ChatsCollection() |
... | ... |
@@ -70,6 +73,11 @@ this.App = |
70 | 70 |
App.Collections.contacts.udpateVcard(result) |
71 | 71 |
) |
72 | 72 |
|
73 |
+ App._dispatcher.bind('app.roster.subscriptionChanged', (subscription) -> |
|
74 |
+ App.debug 'subscription changed' |
|
75 |
+ App.Collections.contacts.subscriptionChanged(subscription) |
|
76 |
+ ) |
|
77 |
+ |
|
73 | 78 |
Models: |
74 | 79 |
me: null |
75 | 80 |
|
... | ... |
@@ -7,7 +7,7 @@ class Xmpp.Models.Contact extends Xmpp.Models.Model |
7 | 7 |
status: 'offline' |
8 | 8 |
message: '' |
9 | 9 |
avatar: '' |
10 |
- belongsTo: '' |
|
10 |
+ belongsTo: [] |
|
11 | 11 |
|
12 | 12 |
initialize: -> |
13 | 13 |
_.bindAll(this) |
... | ... |
@@ -31,6 +31,7 @@ class Xmpp.Collections.ContactsCollection extends Backbone.Collection |
31 | 31 |
@activeList.setAsActiveChatGroup() |
32 | 32 |
|
33 | 33 |
@on('add', @appendContact) |
34 |
+ @on('change:belongsTo', @mergeContacts) |
|
34 | 35 |
|
35 | 36 |
Backbone.Events.on('openChat', (chat) => |
36 | 37 |
@moveToInactiveList('all') |
... | ... |
@@ -42,8 +43,21 @@ class Xmpp.Collections.ContactsCollection extends Backbone.Collection |
42 | 42 |
) |
43 | 43 |
|
44 | 44 |
appendContact: (contact) -> |
45 |
+ App.debug ['apppend', contact] |
|
45 | 46 |
@friendsList.appendContact(contact) |
46 | 47 |
|
48 |
+ mergeContacts: (contact) -> |
|
49 |
+ App.debug ['merging contacts', contact] |
|
50 |
+ #TODO: ak ten isty clovek je vo viacerych rosteroch, treba nastavit spravne belongsTo |
|
51 |
+ |
|
52 |
+ existingContact = @get(contact.get('id')) |
|
53 |
+ if existingContact? |
|
54 |
+ alreadyBelongsTo = existingContact.get('belongsTo') |
|
55 |
+ willBelongTo = contact.get('belongsTo') |
|
56 |
+ existingContact.set(belongsTo: _.union(alreadyBelongsTo, willBelongTo)) |
|
57 |
+ else |
|
58 |
+ @add(contact) |
|
59 |
+ |
|
47 | 60 |
moveToActiveList: (contact) -> |
48 | 61 |
@_switchContactBelongingList(@get(contact), @friendsList, @activeList) |
49 | 62 |
|
... | ... |
@@ -61,6 +75,30 @@ class Xmpp.Collections.ContactsCollection extends Backbone.Collection |
61 | 61 |
udpateVcard: (response) -> |
62 | 62 |
@get(response.jid).set(name: response.vcard.name, avatar: response.vcard.avatar) |
63 | 63 |
|
64 |
+ subscriptionChanged: (newSubscription) -> |
|
65 |
+ if (newSubscription.action == 'subscribed') |
|
66 |
+ App.debug ['subscribed', newSubscription] |
|
67 |
+ |
|
68 |
+ newContact = new Xmpp.Models.Contact( |
|
69 |
+ id: newSubscription.jid |
|
70 |
+ jid: newSubscription.jid |
|
71 |
+ belongsTo: [newSubscription.belongsTo] |
|
72 |
+ ) |
|
73 |
+ @mergeContacts(newContact) |
|
74 |
+ else if (newSubscription.action == 'unsubscribed') |
|
75 |
+ # TODO: show info and ask if user want to remove him from roster |
|
76 |
+ App.debug ['unsubscribed', newSubscription] |
|
77 |
+ |
|
78 |
+ contact = @get(newSubscription.jid) |
|
79 |
+ App.Com.removeContactRemote(contact.get('jid'), newSubscription.belongsTo) |
|
80 |
+ |
|
81 |
+ nowBelongsTo = _.without(contact.get('belongsTo'), newSubscription.belongsTo) |
|
82 |
+ if (nowBelongsTo.length == 0) |
|
83 |
+ Backbone.Events.trigger('removeContact', contact) |
|
84 |
+ @remove(contact) |
|
85 |
+ |
|
86 |
+ # ignore 'unsubscribe' type of action |
|
87 |
+ |
|
64 | 88 |
_switchContactBelongingList: (contact, fromList, toList) -> |
65 | 89 |
if !contact? |
66 | 90 |
false |
... | ... |
@@ -13,6 +13,8 @@ class Xmpp.Views.Contacts.ListView extends Backbone.View |
13 | 13 |
@activeGroup = false |
14 | 14 |
@contactViews = [] |
15 | 15 |
|
16 |
+ Backbone.Events.on('removeContact', @detachContact) |
|
17 |
+ |
|
16 | 18 |
createListContainer: -> |
17 | 19 |
$(@el).html(@template(title: @title, isActiveGroup: @activeGroup)) |
18 | 20 |
|
... | ... |
@@ -81,6 +81,19 @@ class WsRosterController < WebsocketRails::BaseController |
81 | 81 |
# Zacni pocuvat zmeny stavov v rosteri |
82 | 82 |
def start_polling_contacts_state |
83 | 83 |
connection_store[:rosters].each do |roster| |
84 |
+ roster.add_subscription_callback do |roster_item, stanza| |
|
85 |
+ # stan unsubscribe = niekto uz ma nesubscribuje |
|
86 |
+ # stan unsubscribed = niekto ma uz nesubscribuje a aj si ma vymazal |
|
87 |
+ # stan subscribed = niekto moze vidiet moj stav |
|
88 |
+ |
|
89 |
+ client = connection_store[:link_roster_client][roster] |
|
90 |
+ |
|
91 |
+ send_message 'app.roster.subscriptionChanged', |
|
92 |
+ action: stanza.type, |
|
93 |
+ jid: roster_item.jid.strip.to_s, |
|
94 |
+ belongsTo: client.jid.strip.to_s |
|
95 |
+ end |
|
96 |
+ |
|
84 | 97 |
roster.add_presence_callback do |roster_item, old_presence, new_presence| |
85 | 98 |
if new_presence.type == :unavailable |
86 | 99 |
result = {status: :offline, message: ''} |
... | ... |
@@ -108,6 +121,22 @@ class WsRosterController < WebsocketRails::BaseController |
108 | 108 |
end |
109 | 109 |
end |
110 | 110 |
|
111 |
+ def remove_contact |
|
112 |
+ jid = message[:jid] |
|
113 |
+ client_jid = message[:client] |
|
114 |
+ |
|
115 |
+ found_roster_item = nil |
|
116 |
+ connection_store[:rosters].each do |roster| |
|
117 |
+ roster_item = roster.find(jid) |
|
118 |
+ if roster_item.first[1] && connection_store[:link_roster_client][roster].jid.strip.to_s == client_jid |
|
119 |
+ found_roster_item = roster_item.first[1] |
|
120 |
+ break |
|
121 |
+ end |
|
122 |
+ end |
|
123 |
+ |
|
124 |
+ found_roster_item && found_roster_item.remove() |
|
125 |
+ end |
|
126 |
+ |
|
111 | 127 |
## |
112 | 128 |
# Ziskaj informacie o mne (meno, stav, status...) |
113 | 129 |
def myself |
... | ... |
@@ -54,6 +54,7 @@ WebsocketRails::EventMap.describe do |
54 | 54 |
subscribe :startPolling, to: WsRosterController, with_method: :start_polling_contacts_state |
55 | 55 |
subscribe :setPresence, to: WsRosterController, with_method: :set_presence |
56 | 56 |
subscribe :myself, to: WsRosterController, with_method: :myself |
57 |
+ subscribe :removeContact, to: WsRosterController, with_method: :remove_contact |
|
57 | 58 |
end |
58 | 59 |
|
59 | 60 |
end |