X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Ffilters.lua;h=427dcb7cafa14f8cf2f4818393ae9b8221ac6655;hb=95dfe4b0aaaf26ee4651c09eb9757c56210a135a;hp=123226c5f57705bf3cc4180fc1b1101c2bc5043a;hpb=c9d47562dbb4a084d09bfe738050bbfde1fae7e8;p=prosody.git diff --git a/util/filters.lua b/util/filters.lua index 123226c5..427dcb7c 100644 --- a/util/filters.lua +++ b/util/filters.lua @@ -1,7 +1,7 @@ -- 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. -- @@ -10,37 +10,52 @@ local t_insert, t_remove = table.insert, table.remove; module "filters" +local new_filter_hooks = {}; + function initialize(session) - local filters = {}; - session.filters = filters; - - function session.filter(type, data) - local filter_list = filters[type]; - for i = 1, #filter_list do - data = filter_list[i](data); + if not session.filters then + local filters = {}; + session.filters = filters; + + function session.filter(type, data) + local filter_list = filters[type]; + if filter_list then + for i = 1, #filter_list do + data = filter_list[i](data, session); + if data == nil then break; end + end + end + return data; end - return data; end + + for i=1,#new_filter_hooks do + new_filter_hooks[i](session); + end + + return session.filter; end function add_filter(session, type, callback, priority) if not session.filters then initialize(session); end - + local filter_list = session.filters[type]; if not filter_list then filter_list = {}; session.filters[type] = filter_list; + elseif filter_list[callback] then + return; -- Filter already added end - + priority = priority or 0; - + local i = 0; repeat i = i + 1; - until not filter_list[i] or filter_list[filter_list[i]] >= priority; - + until not filter_list[i] or filter_list[filter_list[i]] < priority; + t_insert(filter_list, i, callback); filter_list[callback] = priority; end @@ -59,4 +74,16 @@ function remove_filter(session, type, callback) end end -return _M; \ No newline at end of file +function add_filter_hook(callback) + t_insert(new_filter_hooks, callback); +end + +function remove_filter_hook(callback) + for i=1,#new_filter_hooks do + if new_filter_hooks[i] == callback then + t_remove(new_filter_hooks, i); + end + end +end + +return _M;