util.filters: Don't traceback with no filters of a type added
[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 function initialize(session)
14         local filters = {};
15         session.filters = filters;
16         
17         function session.filter(type, data)
18                 local filter_list = filters[type];
19                 if filter_list then
20                         for i = 1, #filter_list do
21                                 data = filter_list[i](data);
22                         end
23                 end
24                 return data;
25         end
26 end
27
28 function add_filter(session, type, callback, priority)
29         if not session.filters then
30                 initialize(session);
31         end
32         
33         local filter_list = session.filters[type];
34         if not filter_list then
35                 filter_list = {};
36                 session.filters[type] = filter_list;
37         end
38         
39         priority = priority or 0;
40         
41         local i = 0;
42         repeat
43                 i = i + 1;
44         until not filter_list[i] or filter_list[filter_list[i]] >= priority;
45         
46         t_insert(filter_list, i, callback);
47         filter_list[callback] = priority;
48 end
49
50 function remove_filter(session, type, callback)
51         if not session.filters then return; end
52         local filter_list = session.filters[type];
53         if filter_list and filter_list[callback] then
54                 for i=1, #filter_list do
55                         if filter_list[i] == callback then
56                                 t_remove(filter_list, i);
57                                 filter_list[callback] = nil;
58                                 return true;
59                         end
60                 end
61         end
62 end
63
64 return _M;