class WsRosterController < WebsocketRails::BaseController
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()
clients = Token.fing_user_accounts_having_to_token(session[:token])
clients.each do |credentials|
begin
client = Signin.try_login(credentials["jid"], credentials["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.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_presence_callback do |roster_item, old_presence, new_presence|
if new_presence.type == :unavailable
result = {status: :offline, message: ''}
else
status = uniform_presence(new_presence.show)
result = { status: status, message: new_presence.status.to_s }
end
send_message 'app.roster.statusChanged',
jid: roster_item.jid.strip.to_s, status: result
end
end
end
def set_presence
connection_store[:clients].each do |client|
presence = Jabber::Presence.new.set_type(:available)
client.send(presence)