examples/lm/iq_register.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Tue, 31 Mar 2009 18:35:34 +0300
changeset 68 742878c74b8e
child 70 e43e386c8a33
permissions -rw-r--r--
Lm separation, privacy * Library parts moved to lm.* * mc_* renamed to plain names * Privacy lists suppart (not tested)


-- IN-BAND REGISTRATION (XEP-0077)

-- library

local iq         = require 'lm.iq'
local x_data     = require 'lm.x_data'
local form_field = require 'lm.form_field'

--

local F = { }
local M = { }
M.__index = M

function F.new ( args )
	local form = {
		xmlns        = 'jabber:iq:register',
		ftype        = args.type or 'form',
		registered   = args.registered,
		-- XXX title
		instructions = args.instructions,
		x_data       = args.x_data,
		f            = { },
	}
	setmetatable ( form, M )
	return form
end

function F.parse ( query )
	local instructions = query:child ( 'instructions' )
	if instructions then
		instructions = instructions:value ()
	end
	
	local registered
	if query:child ( 'registered' ) then
		registered = true
	end

	local x = query:child ( 'x' )
	if x and x:attribute ( 'xmlns' ) == 'jabber:x:data' then
		return F.new { type = 'form', registered = registered, instructions = instructions, x_data = x_data.parse ( x ) }
	end

	local form = F.new { type = 'form', registered = registered, instructions = instructions }

	local field = query:child ()
	while field do
		local name  = field:name ()
		if name ~= 'instructions' and name ~= 'registered' then
			form:add ( name, { type = 'text-single', value = field:value () or '' } )
		end
		field = field:next ()
	end

	return form
end

function M.type ( form )
	return form.ftype
end

function M.desc ( form )
	if form.x_data then
		return form.x_data:desc ()
	else
		return form.title, form.instructions
	end
end

function M.format ( form, root, format_as )
	local ft = format_as or form:type ()

	if form.x_data then
		root.query = form.x_data:format ( { xmlns = 'jabber:iq:register' }, ft )
	else
		root.query = { xmlns = 'jabber:iq:register' }
		for index, field in form:fields () do
			root.query[field:name ()] = field:value ()
		end
	end

	if ft == 'form' then
		local title, instructions = form:desc ()
		if instructions then
			root.query.instructions = { instructions }
		end
		if form.registered then
			root.query.registered = { }
		end
	end

	return root
end

function M.fields ( form )
	if form.x_data then
		return form.x_data:fields ()
	else
		return ipairs ( form.f )
	end
end

function M.add ( form, name, fld )
	if form.x_data then
		return form.x_data:add ( name, fld )
	else
		fld.var   = name
		fld.index = #form.f + 1
		local obj = form_field.new ( fld )
		table.insert ( form.f, obj )
		form.f[name] = obj
		return obj
	end
end

function M.field ( form, name )
	if form.x_data then
		return form.x_data:field ( name )
	else
		return form.f[name]
	end
end

function F.register ( conn, to, success, fail )
	iq.send ( conn, to, 'get',
		{
			query = { xmlns = 'jabber:iq:register' },
		},
		function ( mess )
			local query = mess:child ( 'query' )
			if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then
				success ( F.parse ( query ),
					function ( form, success, fail )
						iq.send ( conn, to, 'set', form:format ( form, { }, 'submit' ), success , fail )
					end,
					function ( form, success, fail )
						success ()
					end )
			end
		end, fail )
end

function F.unregister ( conn, to, success, fail )
	iq.send ( conn, to, 'set',
		{
			query = { xmlns = 'jabber:iq:register',
				remove = { },
			},
		},
		function ( mess )
			success ()
		end,
		function ( mesg, mess )
			local query = mess:child ( 'query' )
			if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then
				success ( F.parse ( query ),
					function ( form, success, fail )
						iq.send ( conn, to, 'set', form:format ( form, { }, 'submit' ), success, fail )
					end,
					function ( form, success, fail )
						success ()
					end )
			else
				fail ( mesg )
			end
		end )
end

return F

-- vim: se ts=4: --