Merge 0.9 -> 0.10
[prosody.git] / util / filters.lua
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 --
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
7 --
8
9 local t_insert, t_remove = table.insert, table.remove;
10
11 module "filters"
12
13 local new_filter_hooks = {};
14
15 function initialize(session)
16         if not session.filters then
17                 local filters = {};
18                 session.filters = filters;
19
20                 function session.filter(type, data)
21                         local filter_list = filters[type];
22                         if filter_list then
23                                 for i = 1, #filter_list do
24                                         data = filter_list[i](data, session);
25                                         if data == nil then break; end
26                                 end
27                         end
28                         return data;
29                 end
30         end
31
32         for i=1,#new_filter_hooks do
33                 new_filter_hooks[i](session);
34         end
35
36         return session.filter;
37 end
38
39 function add_filter(session, type, callback, priority)
40         if not session.filters then
41                 initialize(session);
42         end
43
44         local filter_list = session.filters[type];
45         if not filter_list then
46                 filter_list = {};
47                 session.filters[type] = filter_list;
48         end
49
50         priority = priority or 0;
51
52         local i = 0;
53         repeat
54                 i = i + 1;
55         until not filter_list[i] or filter_list[filter_list[i]] < priority;
56
57         t_insert(filter_list, i, callback);
58         filter_list[callback] = priority;
59 end
60
61 function remove_filter(session, type, callback)
62         if not session.filters then return; end
63         local filter_list = session.filters[type];
64         if filter_list and filter_list[callback] then
65                 for i=1, #filter_list do
66                         if filter_list[i] == callback then
67                                 t_remove(filter_list, i);
68                                 filter_list[callback] = nil;
69                                 return true;
70                         end
71                 end
72         end
73 end
74
75 function add_filter_hook(callback)
76         t_insert(new_filter_hooks, callback);
77 end
78
79 function remove_filter_hook(callback)
80         for i=1,#new_filter_hooks do
81                 if new_filter_hooks[i] == callback then
82                         t_remove(new_filter_hooks, i);
83                 end
84         end
85 end
86
87 return _M;