class WsRosterController < WsController
require 'xmpp4r/roster'
require 'xmpp4r/vcard'
def initialize
super
@storages_arr = [:clients, :rosters]
@storages_hash = [:link_roster_client, :presences]
end
def initialize_storage
@storages_arr.each do |storage|
connection_store[storage] = []
end
@storages_hash.each do |storage|
connection_store[storage] = {}
end
end
def connect
initialize_storage()
cookies = env['rack.request.cookie_hash']
cipher_key = cookies['key']
cipher_iv = cookies['iv']
clients = session[:users].map do |jid, encrypted_pass|
decrypted_pass = Security::decrypt(encrypted_pass, cipher_key, cipher_iv)
{jid: jid, pass: decrypted_pass}
end
clients.each do |client|
begin
client = Signin.try_login(client[:jid], client[:pass])
connection_store[:clients] << client
rescue Signin::LoginError
send_message 'app.client.cannot_connect', true
end
end
end
def init_roster
all_jids = []
connection_store[:clients].each do |client|
roster = Jabber::Roster::Helper.new(client)
connection_store[:rosters] << roster
connection_store[:link_roster_client][roster] = client
roster.get_roster()
roster.wait_for_roster()
roster.items.each do |jid, contact|
all_jids << {
jid: jid.to_s,
belongsTo: client.jid.strip.to_s
}
end
end
trigger_success contacts: all_jids
end
def start_fetching_vcards
connection_store[:rosters].each do |roster|
client = connection_store[:link_roster_client][roster]
roster.items.each do |jid, contact|
Thread.new do
vcard = get_vcard(client, jid.to_s)
send_message 'app.roster.vcard', jid: jid.to_s, vcard: vcard
end
end
end
end
def start_polling_contacts_state
connection_store[:rosters].each do |roster|
roster.add_subscription_callback do |roster_item, stanza|
client = connection_store[:link_roster_client][roster]
send_message 'app.roster.subscriptionChanged',
action: stanza.type,
jid: roster_item.jid.strip.to_s,