examples/lm/privacy.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Tue, 21 Aug 2012 15:44:05 +0300
changeset 130 de560dec87a5
parent 68 742878c74b8e
permissions -rw-r--r--
Update api docs


local lm = require 'lm'
local iq = require 'lm.iq'

local F = { }
local O = {
	handler =
		function ( name )
		end,
}

function F.handler ( handler )
	O.handler = handler
end

function F.lists ( conn, success, fail )
	iq.send ( conn, nil, 'get',
		{
			query = { xmlns = 'jabber:iq:privacy' },
		},
		function ( mess )
			local ret  = { }
			local item = mess:child( 'query' ):child ()
			while item do
				local tag  = item:name ()
				local name = item:attribute ( 'name' )
				if tag == 'list' then
					table.insert ( ret, name )
				elseif tag == 'active' or tag == 'default' then
					ret[tag] = name
				end
				item = item:next ()
			end
			success ( ret )
		end, fail )
end

function F.list ( conn, name, success, fail )
	iq.send ( conn, nil, 'get',
		{
			query = { xmlns = 'jabber:iq:privacy',
				list = { name = name },
			},
		},
		function ( mess )
			local ret  = { }
			local item = mess:path( 'query', 'list' ):child ()
			while item do
				local q = {
					type   = item:attribute ( 'type' ),
					value  = item:attribute ( 'value' ),
					action = item:attribute ( 'action' ),
					order  = item:attribute ( 'order' ),
				}
				local stanza = item:child ()
				if stanza then
					q.stanzas = { }
					while stanza do
						table.insert ( q.stanzas, stanza:name () )
						stanza = stanza:next ()
					end
				end
				item = item:next ()
			end
			success ( ret )
		end, fail )
end

-- name may be nil
function F.active ( conn, name, success, fail )
	iq.send ( conn, nil, 'set',
		{
			query = { xmlns = 'jabber:iq:privacy',
				active = { name = name },
			},
		}, success, fail )
end

-- name may be nil
function F.default ( conn, name, success, fail )
	iq.send ( conn, nil, 'set',
		{
			query = { xmlns = 'jabber:iq:privacy',
				default = { name = name },
			},
		}, success, fail )
end

function F.set ( conn, name, list, success, fail )
	local items = { }
	local order = 1
	for i, item in ipairs ( list ) do
		if list.order then
			order = list.order
		else
			order = order + 1
		end
		local q = {
			type   = list.type,
			value  = list.value,
			action = list.action,
			order  = order,
		}
		if list.stanzas then
			for j, stanza in ipairs ( list.stanzas ) do
				q[stanza] = { }
			end
		end
		table.insert ( items, q )
	end
	iq.send ( conn, nil, 'set',
		{
			query = { xmlns = 'jabber:iq:privacy',
				list = { name = name,
					item = items,
				},
			},
		}, success, fail )
end

function F.iq_handler ( conn, mess )
	local query = mess:child ( 'query' )
	if query and query:attribute ( 'xmlns' ) == 'jabber:iq:privacy' then
		conn:send ( lm.message.create { mtype = 'iq-result', id = mess:attribute ( 'id' ) } )
		O.handler ( query:child( 'list' ):attribute ( 'name' ) )
		return true
	end
	return false
end

return F

-- vim: se ts=4: --