scripts/xep0004.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Mon, 23 Feb 2009 23:16:46 +0200
changeset 4 bca17e4a9851
permissions -rw-r--r--
Added sample configuration files


forms = { }

-- expects lm node   x = { xmlns = 'jabber:x:data', type = 'form', ... }
-- returns form index in forms table, you can do whatever you want to upper level table, except exp and val fields.
function parse_form ( node )
	local form = { title = 'unknown', exp = '', val = { } }
	if node:child ( 'title' ) then
		form.title = node:child( 'title' ):value ()
	end
	if node:child ( 'instructions' ) then
		form.exp = form.exp .. 'Instructions: ' .. node:child( 'instructions' ):value () .. '\n'
	end
	form.exp = form.exp .. 'Fields:\n'
	local field = node:children ()
	while field do
		if field:name () == 'field' then
			local field_type  = field:attribute ( 'type' ) or 'text-single'
			local field_var   = field:attribute ( 'var' ) or ''
			form.exp = form.exp .. ' - ' .. field_var .. '\n   Type: ' .. field_type .. '\n'
			if field:attribute ( 'label' ) then
				form.exp = form.exp .. '   Label: ' .. ( field:attribute ( 'label' ) or '' ) .. '\n'
			end
			if field:child ( 'desc' ) then
				form.exp = form.exp .. '   Description: ' .. field:child( 'desc' ):value () .. '\n'
			end
			if field:child ( 'required' ) then
				form.exp = form.exp .. '   Required: yes\n'
			end

			local field_value
			if field_type == 'jid-multi' or field_type == 'list-multi' or field_type == 'text-multi' then
				field_value = { }
				local value = field:children ()
				form.exp = form.exp .. '   Default values:\n'
				while value do
					if value:name () == 'value' then
						table.insert ( field_value, { value:value () } )
						form.exp = form.exp .. '    - ' .. value:value () .. '\n'
					end
					value = value:next ()
				end
			else
				if field:child ( 'value' ) then
					field_value = field:child( 'value' ):value ()
					form.exp = form.exp .. '   Default value: ' .. field_value .. '\n'
				end
			end

			if field_type == 'list-single' or field_type == 'list-multi' then
				form.exp = form.exp .. '   List options:\n'
				local option = field:children ()
				while option do
					if option:name () == 'option' then
						form.exp = form.exp .. '    - ' .. ( option:child( 'value' ):value () or '' ) .. ': ' .. ( option:attribute ( 'label' ) or '' ) .. '\n'
					end
					option = option:next ()
				end
			end

			if field_type == 'boolean' then
				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '0' } } )
			elseif field_type == 'fixed' then
			elseif field_type == 'hidden' then
				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
			elseif field_type == 'list-single' then
				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
			elseif field_type == 'list-multi' then
				table.insert ( form.val, { type = field_type, var = field_var, value = field_value or { } } )
			elseif field_type == 'jid-multi' or field_type == 'text-multi' then
				table.insert ( form.val, { type = field_type, var = field_var, value = field_value or { } } )
			elseif field_type == 'jid-single' or field_type == 'text-single' then
				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
			elseif field_type == 'text-private' then
				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
			end
		end
		field = field:next ()
	end
	table.insert ( forms, form )
	return #forms
end

function form_set ( id, name, value )
	if forms[id] then
		for index, field in ipairs ( forms[id].val ) do
			if field.var == name then
				if value == nil then
					field.value = { }
				else
					if field.type == 'jid-multi' or field.type == 'list-multi' or field.type == 'text-multi' then
						table.insert ( field.value, { value } )
					else
						field.value = { value }
					end
				end
			end
		end
	end
end

main.add_command ( 'form',
	function ( args )
		args = parse_args ( args )
		local action = args[1]
		local id = tonumber (args[1])
		if forms[id] then
			if args[2] then
				local field = args[2]
				if args[3] == 'clear' then
					form_set ( id, field, nil )
				else
					args[1] = nil
					args[2] = nil
					if args[3] == 'set' then
						args[3] = nil
					end
					form_set ( id, field, rebuild_args_string ( args ) )
				end
			else
				print ( 'Form: ' .. ( forms[id].title or '' ) .. '\n' .. forms[id].exp )
				print ( 'Fields:' )
				for index, field in ipairs ( forms[id].val ) do -- this should not be here, but setting up callback just for this...
					if field.type == 'jid-multi' or field.type == 'list-multi' or field.type == 'text-multi' then
						print ( ' - ' .. field.var .. ' [' .. field.type .. ']:' )
						for vin, value in ipairs ( field.value ) do
							print ( '    * ' .. value[1] )
						end
					else
						print ( ' - ' .. field.var .. ' [' .. field.type .. ']: ' .. field.value[1] )
					end
				end
			end
		elseif action == 'del' then
			forms[tonumber(args[2])] = nil
		elseif action == 'send' then
			local form = forms[tonumber(args[2])]
			if form then
				form.send ( form )
			end
		else
			print ( 'Forms list:' )
			for id, form in ipairs ( forms ) do
				print ( ' - ' .. tostring(id) .. ' ' .. form.title .. ' [' .. ( form.status or 'unknown' ) .. ']' )
			end
		end
	end )

commands_help['form'] = "[del form_id | send form_id | form_id [field_name {clear | [set] value}]\n\nWith bare form id prints info on that form.\nWith field name sets or clears field value. Set subcommand is optional, just to allow values, starting with 'clear'.\nWithout arguments prints form list."

-- vim: se ts=4: --