Software /
code /
prosody
File
plugins/mod_message.lua @ 4108:e3e3aa286334
util.datamanager: Handle gracefully the lack of prosody.paths.data
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 11 Jan 2011 04:19:03 +0000 |
parent | 4040:898399fd8da1 |
child | 4759:c4a0c420d232 |
line wrap: on
line source
-- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- local full_sessions = full_sessions; local bare_sessions = bare_sessions; local st = require "util.stanza"; local jid_bare = require "util.jid".bare; local jid_split = require "util.jid".split; local user_exists = require "core.usermanager".user_exists; local t_insert = table.insert; local function process_to_bare(bare, origin, stanza) local user = bare_sessions[bare]; local t = stanza.attr.type; if t == "error" then -- discard elseif t == "groupchat" then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); elseif t == "headline" then if user and stanza.attr.to == bare then for _, session in pairs(user.sessions) do if session.presence and session.priority >= 0 then session.send(stanza); end end end -- current policy is to discard headlines if no recipient is available else -- chat or normal message if user then -- some resources are connected local recipients = user.top_resources; if recipients then for i=1,#recipients do recipients[i].send(stanza); end return true; end end -- no resources are online local node, host = jid_split(bare); local ok if user_exists(node, host) then -- TODO apply the default privacy list ok = module:fire_event('message/offline/handle', { origin = origin, stanza = stanza, }); end if not ok then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); end end return true; end module:hook("message/full", function(data) -- message to full JID recieved local origin, stanza = data.origin, data.stanza; local session = full_sessions[stanza.attr.to]; if session then -- TODO fire post processing event session.send(stanza); return true; else -- resource not online return process_to_bare(jid_bare(stanza.attr.to), origin, stanza); end end); module:hook("message/bare", function(data) -- message to bare JID recieved local origin, stanza = data.origin, data.stanza; return process_to_bare(stanza.attr.to or (origin.username..'@'..origin.host), origin, stanza); end); module:add_feature("msgoffline");