app/controllers/ws_controller.rb
2a61cdcc
 class WsController < WebsocketRails::BaseController
 
     protected
 
7d2a86e9
     def set_contacts_in_multichat(client, chat_id, owner, attendants = [])
0f555f4a
         connection_store[:opened_chats] = {} if ! connection_store[:opened_chats]
         connection_store[:opened_chats][client] = {} if ! connection_store[:opened_chats][client]
         connection_store[:opened_chats][client][chat_id] = {owner: owner, attendants: attendants}
     end
 
2a61cdcc
     def find_client(client_jid)
         connection_store[:clients].find do |client|
             client.jid.strip.to_s == client_jid
         end
     end
 
bc02cb76
     def where_i_am_multichat_owner(client)
         chats_owner = []
 
         if connection_store[:opened_chats] and connection_store[:opened_chats][client]
             connection_store[:opened_chats][client].each do |chat_id, contacts|
                 if contacts[:owner] == client.jid.to_s
                     chats_owner << chat_id
5011e360
                 end
             end
         end
 
         chats_owner
     end
 
bc02cb76
     def kick_from_all_multichats(client, somebody_to_kick)
         chats = where_i_am_multichat_owner(client)
         chats.each do |chat_id|
5011e360
             contacts = connection_store[:opened_chats][client][chat_id][:attendants]
46ab179d
 
             size_before = contacts.size
bc02cb76
             contacts -= [somebody_to_kick.to_s]
46ab179d
             size_after = contacts.size
 
             return if size_after == size_before
5011e360
 
             if contacts.empty?
90472b75
                 destroy_multichat(client.jid, chat_id)
5011e360
             else
                 contacts.each do |contact|
90472b75
                     client.send(MessageBuilder::send_multichat_contacts(client.jid.to_s, contact, chat_id, contacts))
5011e360
                 end
 
90472b75
                 sync_contacts_frontend(client.jid, client.jid, chat_id, contacts)
5011e360
             end
         end
     end
 
bc02cb76
     def kick_myself_from_multichat(client, owner)
         if connection_store[:opened_chats] and connection_store[:opened_chats][client]
             connection_store[:opened_chats][client].each do |chat_id, chat|
                 if chat[:owner] == owner.to_s and chat[:attendants].include? client.jid.to_s
                     destroy_multichat(client.jid, chat_id)
                 end
             end
         end
     end
 
90472b75
     def sync_contacts_frontend(owner, me, chat_id, contacts)
5011e360
         send_message 'app.chat.updateSyncedContacts',
90472b75
                      me: me.strip.to_s,
                      contacts: strip_all(contacts),
                      owner: owner.strip.to_s,
5011e360
                      chat_id: chat_id
     end
 
90472b75
     def destroy_multichat(me, chat_id)
         client = find_client(me.strip.to_s)
88c1de39
         connection_store[:opened_chats][client].delete(chat_id)
 
         send_message 'app.chat.destroyMultichat', chat_id: chat_id
     end
 
5011e360
     def xml_contacts_to_array(xml_contacts)
         xml_contacts.get_elements('contact').map do |contact|
             contact.text
         end
     end
e513299a
 
     def find_multichat_supported(jid_stripped)
         contact = connection_store[:presences][jid_stripped.to_sym].find do |resource, info|
             info[:multichat]
         end
         contact.first
     end
 
     def strip_all(contacts)
         if contacts.is_a? Array
             contacts.map do |jid|
                 Jabber::JID.new(jid).strip!.to_s
             end
         else
             contacts
         end
     end
2a61cdcc
 end