mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
96 lines
2.1 KiB
Lua
96 lines
2.1 KiB
Lua
-- 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.
|
|
--
|
|
|
|
local t_insert, t_remove = table.insert, table.remove;
|
|
|
|
local _ENV = nil;
|
|
-- luacheck: std none
|
|
|
|
local new_filter_hooks = {};
|
|
|
|
local function initialize(session)
|
|
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
|
|
end
|
|
|
|
for i=1,#new_filter_hooks do
|
|
new_filter_hooks[i](session);
|
|
end
|
|
|
|
return session.filter;
|
|
end
|
|
|
|
local 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;
|
|
|
|
t_insert(filter_list, i, callback);
|
|
filter_list[callback] = priority;
|
|
end
|
|
|
|
local function remove_filter(session, type, callback)
|
|
if not session.filters then return; end
|
|
local filter_list = session.filters[type];
|
|
if filter_list and filter_list[callback] then
|
|
for i=1, #filter_list do
|
|
if filter_list[i] == callback then
|
|
t_remove(filter_list, i);
|
|
filter_list[callback] = nil;
|
|
return true;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function add_filter_hook(callback)
|
|
t_insert(new_filter_hooks, callback);
|
|
end
|
|
|
|
local 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 {
|
|
initialize = initialize;
|
|
add_filter = add_filter;
|
|
remove_filter = remove_filter;
|
|
add_filter_hook = add_filter_hook;
|
|
remove_filter_hook = remove_filter_hook;
|
|
};
|