X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmod_message.lua;h=395307ba582221ff4c7b4df02dc108876a1f0070;hb=04a2051ee150255ca12514016c0b451851c5c1ca;hp=fc3ecbd75c7da283c41c3a0e3bddfa130f1efd72;hpb=a95ce10d63ee710f28e81daf0e9015e70fe84a8b;p=prosody.git diff --git a/plugins/mod_message.lua b/plugins/mod_message.lua index fc3ecbd7..395307ba 100644 --- a/plugins/mod_message.lua +++ b/plugins/mod_message.lua @@ -1,38 +1,31 @@ +-- Prosody IM +-- Copyright (C) 2008-2009 Matthew Wild +-- Copyright (C) 2008-2009 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 offlinemanager = require "core.offlinemanager"; - -local function select_top_resources(user) - local priority = 0; - local recipients = {}; - for _, session in pairs(user.sessions) do -- find resource with greatest priority - if session.presence then - local p = session.priority; - if p > priority then - priority = p; - recipients = {session}; - elseif p == priority then - t_insert(recipients, session); - end - end - end - return recipients; -end +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 return true; end - if t == "groupchat" then + if t == "error" then + -- discard + elseif t == "groupchat" then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); - return true; - end - if t == "headline" then + elseif t == "headline" then if user then for _, session in pairs(user.sessions) do if session.presence and session.priority >= 0 then @@ -40,25 +33,24 @@ local function process_to_bare(bare, origin, stanza) end end end -- current policy is to discard headlines if no recipient is available - return true; - end - -- chat or normal message - if user then -- some resources are connected - local recipients = select_top_resources(user); - if #recipients > 0 then - for i=1,#recipients do - recipients[i].send(stanza); + 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 - return true; end - end - -- no resources are online - local node, host = jid_split(bare); - if user_exists(node, host) then - -- TODO apply the default privacy list - offlinemanager.store(node, host, stanza); - else - origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); + -- no resources are online + local node, host = jid_split(bare); + if user_exists(node, host) then + -- TODO apply the default privacy list + offlinemanager.store(node, host, stanza); + else + origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); + end end return true; end @@ -83,3 +75,5 @@ module:hook("message/bare", function(data) return process_to_bare(stanza.attr.to or (origin.username..'@'..origin.host), origin, stanza); end); + +module:add_feature("msgoffline");