comparison core/stanza_dispatch.lua @ 2:9bb397205f26

Working presence!
author matthew
date Sun, 24 Aug 2008 04:34:01 +0000
parents b8787e859fd2
children 09c3845ed442
comparison
equal deleted inserted replaced
1:b8787e859fd2 2:9bb397205f26
37 require "core.usermanager" 37 require "core.usermanager"
38 if usermanager.validate_credentials(session.host, username, password) then 38 if usermanager.validate_credentials(session.host, username, password) then
39 -- Authentication successful! 39 -- Authentication successful!
40 session.username = username; 40 session.username = username;
41 session.resource = resource; 41 session.resource = resource;
42 session.full_jid = username.."@"..session.host.."/"..session.resource;
42 if not hosts[session.host].sessions[username] then 43 if not hosts[session.host].sessions[username] then
43 hosts[session.host].sessions[username] = { sessions = {} }; 44 hosts[session.host].sessions[username] = { sessions = {} };
44 end 45 end
45 hosts[session.host].sessions[username].sessions[resource] = session; 46 hosts[session.host].sessions[username].sessions[resource] = session;
46 send(st.reply(stanza)); 47 send(st.reply(stanza));
95 send(format("<iq type='error' id='%s'><error type='cancel'><service-unavailable/></error></iq>", stanza.attr.id)); 96 send(format("<iq type='error' id='%s'><error type='cancel'><service-unavailable/></error></iq>", stanza.attr.id));
96 return; 97 return;
97 end 98 end
98 elseif stanza.name == "presence" then 99 elseif stanza.name == "presence" then
99 if session.roster then 100 if session.roster then
101 local initial_presence = not session.last_presence;
102 session.last_presence = stanza;
103
100 -- Broadcast presence and probes 104 -- Broadcast presence and probes
101 local broadcast = st.presence({ from = session.username.."@"..session.host.."/"..session.resource }); 105 local broadcast = st.presence({ from = session.full_jid, type = stanza.attr.type });
102 local probe = st.presence { from = broadcast.attr.from, type = "probe" }; 106 --local probe = st.presence { from = broadcast.attr.from, type = "probe" };
103 107
104 for child in stanza:children() do 108 for child in stanza:childtags() do
105 broadcast:tag(child.name, child.attr); 109 broadcast:text(tostring(child));
106 end 110 end
107 for contact in pairs(session.roster) do 111 for contact_jid in pairs(session.roster) do
108 broadcast.attr.to = contact; 112 broadcast.attr.to = contact_jid;
109 send_to(contact, broadcast); 113 send_to(contact_jid, broadcast);
110 --local host = jid.host(contact); 114 if initial_presence then
111 --if hosts[host] and hosts[host].type == "local" then 115 print("Initital presence");
112 --local node, host = jid.split(contact); 116 local node, host = jid.split(contact_jid);
113 --if host[host].sessions[node] 117 if hosts[host] and hosts[host].type == "local" then
114 --local pres = st.presence { from = con 118 local contact = hosts[host].sessions[node]
115 --else 119 if contact then
116 -- probe.attr.to = contact; 120 local pres = st.presence { to = session.full_jid };
117 -- send_to(contact, probe); 121 for resource, contact_session in pairs(contact.sessions) do
118 --end 122 if contact_session.last_presence then
123 pres.tags = contact_session.last_presence.tags;
124 pres.attr.from = contact_session.full_jid;
125 send(pres);
126 end
127 end
128 end
129 --FIXME: Do we send unavailable if they are offline?
130 else
131 probe.attr.to = contact;
132 send_to(contact, probe);
133 end
134 end
119 end 135 end
120 136
121 -- Probe for our contacts' presence 137 -- Probe for our contacts' presence
122 end 138 end
123 end 139 end