8 function log(type, area, message) |
8 function log(type, area, message) |
9 print(type, area, message); |
9 print(type, area, message); |
10 end |
10 end |
11 |
11 |
12 require "core.stanza_dispatch" |
12 require "core.stanza_dispatch" |
13 init_xmlhandlers = require "core.xmlhandlers" |
13 local init_xmlhandlers = require "core.xmlhandlers" |
14 require "core.rostermanager" |
14 require "core.rostermanager" |
15 require "core.offlinemessage" |
15 require "core.offlinemessage" |
16 require "core.usermanager" |
16 require "core.usermanager" |
17 require "util.stanza" |
17 require "util.stanza" |
18 require "util.jid" |
18 require "util.jid" |
101 end |
101 end |
102 end |
102 end |
103 |
103 |
104 function handler(conn, data, err) |
104 function handler(conn, data, err) |
105 local session = sessions[conn]; |
105 local session = sessions[conn]; |
106 |
106 |
107 if not session then |
107 if not session then |
108 sessions[conn] = { conn = conn, notopen = true, priority = 0 }; |
108 sessions[conn] = { conn = conn, notopen = true, priority = 0 }; |
109 session = sessions[conn]; |
109 session = sessions[conn]; |
110 |
110 |
111 -- Logging functions -- |
111 -- Logging functions -- |
112 |
112 |
113 local mainlog, log = log; |
113 local mainlog, log = log; |
114 do |
114 do |
115 local conn_name = tostring(conn):match("%w+$"); |
115 local conn_name = tostring(conn):match("%w+$"); |
116 log = function (type, area, message) mainlog(type, conn_name, message); end |
116 log = function (type, area, message) mainlog(type, conn_name, message); end |
|
117 --log = function () end |
117 end |
118 end |
118 local print = function (...) log("info", "core", t_concatall({...}, "\t")); end |
119 local print = function (...) log("info", "core", t_concatall({...}, "\t")); end |
119 session.log = log; |
120 session.log = log; |
120 |
121 |
121 -- -- -- |
122 -- -- -- |
123 -- Send buffers -- |
124 -- Send buffers -- |
124 |
125 |
125 local send = function (data) print("Sending...", tostring(data)); conn.write(tostring(data)); end; |
126 local send = function (data) print("Sending...", tostring(data)); conn.write(tostring(data)); end; |
126 session.send, session.send_to = send, send_to; |
127 session.send, session.send_to = send, send_to; |
127 |
128 |
128 print("Client connected"); |
129 print("Client connected"); |
129 |
130 |
130 session.stanza_dispatch = init_stanza_dispatcher(session); |
131 session.stanza_dispatch = init_stanza_dispatcher(session); |
131 session.xml_handlers = init_xmlhandlers(session); |
132 session.xml_handlers = init_xmlhandlers(session); |
132 session.parser = lxp.new(session.xml_handlers, ":"); |
133 session.parser = lxp.new(session.xml_handlers, ":"); |
133 |
134 |
134 function session.disconnect(err) |
135 function session.disconnect(err) |
135 if session.last_presence.attr.type ~= "unavailable" then |
136 if session.last_presence and session.last_presence.attr.type ~= "unavailable" then |
136 local pres = st.presence{ type = "unavailable" }; |
137 local pres = st.presence{ type = "unavailable" }; |
137 if err == "closed" then err = "connection closed"; end |
138 if err == "closed" then err = "connection closed"; end |
138 pres:tag("status"):text("Disconnected: "..err); |
139 pres:tag("status"):text("Disconnected: "..err); |
139 session.stanza_dispatch(pres); |
140 session.stanza_dispatch(pres); |
140 end |
141 end |
|
142 if session.username then |
141 hosts[session.host].sessions[session.username] = nil; |
143 hosts[session.host].sessions[session.username] = nil; |
142 session = nil; |
|
143 print("Disconnected: "..err); |
|
144 end |
144 end |
|
145 session = nil; |
|
146 print("Disconnected: "..err); |
|
147 collectgarbage("collect"); |
145 end |
148 end |
|
149 end |
146 if data then |
150 if data then |
147 session.parser:parse(data); |
151 session.parser:parse(data); |
148 end |
152 end |
149 |
153 |
150 --log("info", "core", "Client disconnected, connection closed"); |
154 --log("info", "core", "Client disconnected, connection closed"); |