author | Kim Alvefur <zash@zash.se> |
Sat, 27 Apr 2013 22:46:01 +0200 | |
changeset 5531 | 483f795f6f99 |
parent 3943 | ad5924c31953 |
child 5776 | bd0ff8ae98a8 |
child 5849 | 8f451d370dd4 |
permissions | -rw-r--r-- |
3133
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
-- Prosody IM |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
-- Copyright (C) 2008-2010 Matthew Wild |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 |
-- Copyright (C) 2008-2010 Waqas Hussain |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 |
-- |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
-- This project is MIT/X11 licensed. Please see the |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 |
-- COPYING file in the source package for more information. |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
-- |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
local t_insert, t_remove = table.insert, table.remove; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
module "filters" |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
|
3625
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
13 |
local new_filter_hooks = {}; |
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
14 |
|
3134
9a29ad6a9b97
util.filters: Expose the initialization function
Matthew Wild <mwild1@gmail.com>
parents:
3133
diff
changeset
|
15 |
function initialize(session) |
3142
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
16 |
if not session.filters then |
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
17 |
local filters = {}; |
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
18 |
session.filters = filters; |
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
19 |
|
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
20 |
function session.filter(type, data) |
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
21 |
local filter_list = filters[type]; |
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
22 |
if filter_list then |
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
23 |
for i = 1, #filter_list do |
3625
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
24 |
data = filter_list[i](data, session); |
3142
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
25 |
if data == nil then break; end |
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
26 |
end |
3139
7b4f180d7c6f
util.filters: Don't traceback with no filters of a type added
Matthew Wild <mwild1@gmail.com>
parents:
3135
diff
changeset
|
27 |
end |
3142
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
28 |
return data; |
3133
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
end |
3625
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
31 |
|
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
32 |
for i=1,#new_filter_hooks do |
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
33 |
new_filter_hooks[i](session); |
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
34 |
end |
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
35 |
|
3142
3cf02e5e632b
util.filters: Ensure initialize() never initializes an object twice - and return the filter function to the caller
Matthew Wild <mwild1@gmail.com>
parents:
3140
diff
changeset
|
36 |
return session.filter; |
3133
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 |
function add_filter(session, type, callback, priority) |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 |
if not session.filters then |
3134
9a29ad6a9b97
util.filters: Expose the initialization function
Matthew Wild <mwild1@gmail.com>
parents:
3133
diff
changeset
|
41 |
initialize(session); |
3133
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 |
local filter_list = session.filters[type]; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 |
if not filter_list then |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 |
filter_list = {}; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 |
session.filters[type] = filter_list; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 |
priority = priority or 0; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 |
local i = 0; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 |
repeat |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 |
i = i + 1; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 |
until not filter_list[i] or filter_list[filter_list[i]] >= priority; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 |
t_insert(filter_list, i, callback); |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 |
filter_list[callback] = priority; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 |
|
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 |
function remove_filter(session, type, callback) |
3135
f29a297471e3
util.filters: Don't traceback when trying to remove a filter from an uninitialized object
Matthew Wild <mwild1@gmail.com>
parents:
3134
diff
changeset
|
62 |
if not session.filters then return; end |
3133
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
local filter_list = session.filters[type]; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 |
if filter_list and filter_list[callback] then |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 |
for i=1, #filter_list do |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
if filter_list[i] == callback then |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 |
t_remove(filter_list, i); |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 |
filter_list[callback] = nil; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
return true; |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 |
end |
d3f16b4c1ecb
util.filters: New utility library for managing filters on an object
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 |
|
3625
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
75 |
function add_filter_hook(callback) |
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
76 |
t_insert(new_filter_hooks, callback); |
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
77 |
end |
f8d61da5bcc1
util.filters: Support for 'filter hooks' that get called when a session is initialized for filters
Matthew Wild <mwild1@gmail.com>
parents:
3331
diff
changeset
|
78 |
|
3943
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
79 |
function remove_filter_hook(callback) |
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
80 |
for i=1,#new_filter_hooks do |
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
81 |
if new_filter_hooks[i] == callback then |
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
82 |
t_remove(new_filter_hooks, i); |
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
83 |
end |
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
84 |
end |
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
85 |
end |
ad5924c31953
util.filters: Add remove_filter_hook()
Matthew Wild <mwild1@gmail.com>
parents:
3625
diff
changeset
|
86 |
|
3331
57a9cf5f4259
util.filters: Add newline at end of file
Matthew Wild <mwild1@gmail.com>
parents:
3142
diff
changeset
|
87 |
return _M; |