main.lua
changeset 37 06eadafafefa
parent 36 62998e5319e3
child 38 3fdfd6e0cb4e
equal deleted inserted replaced
36:62998e5319e3 37:06eadafafefa
    38 
    38 
    39 local hosts, users = hosts, users;
    39 local hosts, users = hosts, users;
    40 
    40 
    41 function connect_host(host)
    41 function connect_host(host)
    42 	hosts[host] = { type = "remote", sendbuffer = {} };
    42 	hosts[host] = { type = "remote", sendbuffer = {} };
    43 end
       
    44 
       
    45 local function route_stanza(stanza)
       
    46 	if not stanza.attr.to then
       
    47 		-- Has no 'to' attribute, handle internally
       
    48 	end
       
    49 	local node, host, resource = jid.split(stanza.attr.to);
       
    50 	if host and hosts[host] and hosts[host].type == "local" then
       
    51 			-- Is a local host, handle internally
       
    52 			
       
    53 	else
       
    54 		-- Is not for us or a local user, route accordingly
       
    55 	end
       
    56 end
       
    57 
       
    58 local function send_to(session, to, stanza)
       
    59 	local node, host, resource = jid.split(to);
       
    60 	if not hosts[host] then
       
    61 		-- s2s
       
    62 	elseif hosts[host].type == "local" then
       
    63 		print("   ...is to a local user")
       
    64 		local destuser = hosts[host].sessions[node];
       
    65 		if destuser and destuser.sessions then
       
    66 			if not destuser.sessions[resource] then
       
    67 				local best_session;
       
    68 				for resource, session in pairs(destuser.sessions) do
       
    69 					if not best_session then best_session = session;
       
    70 					elseif session.priority >= best_session.priority and session.priority >= 0 then
       
    71 						best_session = session;
       
    72 					end
       
    73 				end
       
    74 				if not best_session then
       
    75 					offlinemessage.new(node, host, stanza);
       
    76 				else
       
    77 					print("resource '"..resource.."' was not online, have chosen to send to '"..best_session.username.."@"..best_session.host.."/"..best_session.resource.."'");
       
    78 					resource = best_session.resource;
       
    79 				end
       
    80 			end
       
    81 			if destuser.sessions[resource] == session then
       
    82 				log("warn", "core", "Attempt to send stanza to self, dropping...");
       
    83 			else
       
    84 				print("...sending...", tostring(stanza));
       
    85 				--destuser.sessions[resource].conn.write(tostring(data));
       
    86 				print("   to conn ", destuser.sessions[resource].conn);
       
    87 				destuser.sessions[resource].conn.write(tostring(stanza));
       
    88 				print("...sent")
       
    89 			end
       
    90 		elseif stanza.name == "message" then
       
    91 			print("   ...will be stored offline");
       
    92 			offlinemessage.new(node, host, stanza);
       
    93 		elseif stanza.name == "iq" then
       
    94 			print("   ...is an iq");
       
    95 			session.send(st.reply(stanza)
       
    96 				:tag("error", { type = "cancel" })
       
    97 					:tag("service-unavailable", { xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas" }));
       
    98 		end
       
    99 		print("   ...done routing");
       
   100 	end
       
   101 end
    43 end
   102 
    44 
   103 function handler(conn, data, err)
    45 function handler(conn, data, err)
   104 	local session = sessions[conn];
    46 	local session = sessions[conn];
   105 
    47