scripts/xep0004.lua
changeset 5 cba039bd6f13
parent 4 bca17e4a9851
child 6 90dceae3ed1f
equal deleted inserted replaced
4:bca17e4a9851 5:cba039bd6f13
     1 
       
     2 forms = { }
       
     3 
       
     4 -- expects lm node   x = { xmlns = 'jabber:x:data', type = 'form', ... }
       
     5 -- returns form index in forms table, you can do whatever you want to upper level table, except exp and val fields.
       
     6 function parse_form ( node )
       
     7 	local form = { title = 'unknown', exp = '', val = { } }
       
     8 	if node:child ( 'title' ) then
       
     9 		form.title = node:child( 'title' ):value ()
       
    10 	end
       
    11 	if node:child ( 'instructions' ) then
       
    12 		form.exp = form.exp .. 'Instructions: ' .. node:child( 'instructions' ):value () .. '\n'
       
    13 	end
       
    14 	form.exp = form.exp .. 'Fields:\n'
       
    15 	local field = node:children ()
       
    16 	while field do
       
    17 		if field:name () == 'field' then
       
    18 			local field_type  = field:attribute ( 'type' ) or 'text-single'
       
    19 			local field_var   = field:attribute ( 'var' ) or ''
       
    20 			form.exp = form.exp .. ' - ' .. field_var .. '\n   Type: ' .. field_type .. '\n'
       
    21 			if field:attribute ( 'label' ) then
       
    22 				form.exp = form.exp .. '   Label: ' .. ( field:attribute ( 'label' ) or '' ) .. '\n'
       
    23 			end
       
    24 			if field:child ( 'desc' ) then
       
    25 				form.exp = form.exp .. '   Description: ' .. field:child( 'desc' ):value () .. '\n'
       
    26 			end
       
    27 			if field:child ( 'required' ) then
       
    28 				form.exp = form.exp .. '   Required: yes\n'
       
    29 			end
       
    30 
       
    31 			local field_value
       
    32 			if field_type == 'jid-multi' or field_type == 'list-multi' or field_type == 'text-multi' then
       
    33 				field_value = { }
       
    34 				local value = field:children ()
       
    35 				form.exp = form.exp .. '   Default values:\n'
       
    36 				while value do
       
    37 					if value:name () == 'value' then
       
    38 						table.insert ( field_value, { value:value () } )
       
    39 						form.exp = form.exp .. '    - ' .. value:value () .. '\n'
       
    40 					end
       
    41 					value = value:next ()
       
    42 				end
       
    43 			else
       
    44 				if field:child ( 'value' ) then
       
    45 					field_value = field:child( 'value' ):value ()
       
    46 					form.exp = form.exp .. '   Default value: ' .. field_value .. '\n'
       
    47 				end
       
    48 			end
       
    49 
       
    50 			if field_type == 'list-single' or field_type == 'list-multi' then
       
    51 				form.exp = form.exp .. '   List options:\n'
       
    52 				local option = field:children ()
       
    53 				while option do
       
    54 					if option:name () == 'option' then
       
    55 						form.exp = form.exp .. '    - ' .. ( option:child( 'value' ):value () or '' ) .. ': ' .. ( option:attribute ( 'label' ) or '' ) .. '\n'
       
    56 					end
       
    57 					option = option:next ()
       
    58 				end
       
    59 			end
       
    60 
       
    61 			if field_type == 'boolean' then
       
    62 				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '0' } } )
       
    63 			elseif field_type == 'fixed' then
       
    64 			elseif field_type == 'hidden' then
       
    65 				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
       
    66 			elseif field_type == 'list-single' then
       
    67 				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
       
    68 			elseif field_type == 'list-multi' then
       
    69 				table.insert ( form.val, { type = field_type, var = field_var, value = field_value or { } } )
       
    70 			elseif field_type == 'jid-multi' or field_type == 'text-multi' then
       
    71 				table.insert ( form.val, { type = field_type, var = field_var, value = field_value or { } } )
       
    72 			elseif field_type == 'jid-single' or field_type == 'text-single' then
       
    73 				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
       
    74 			elseif field_type == 'text-private' then
       
    75 				table.insert ( form.val, { type = field_type, var = field_var, value = { field_value or '' } } )
       
    76 			end
       
    77 		end
       
    78 		field = field:next ()
       
    79 	end
       
    80 	table.insert ( forms, form )
       
    81 	return #forms
       
    82 end
       
    83 
       
    84 function form_set ( id, name, value )
       
    85 	if forms[id] then
       
    86 		for index, field in ipairs ( forms[id].val ) do
       
    87 			if field.var == name then
       
    88 				if value == nil then
       
    89 					field.value = { }
       
    90 				else
       
    91 					if field.type == 'jid-multi' or field.type == 'list-multi' or field.type == 'text-multi' then
       
    92 						table.insert ( field.value, { value } )
       
    93 					else
       
    94 						field.value = { value }
       
    95 					end
       
    96 				end
       
    97 			end
       
    98 		end
       
    99 	end
       
   100 end
       
   101 
       
   102 main.add_command ( 'form',
       
   103 	function ( args )
       
   104 		args = parse_args ( args )
       
   105 		local action = args[1]
       
   106 		local id = tonumber (args[1])
       
   107 		if forms[id] then
       
   108 			if args[2] then
       
   109 				local field = args[2]
       
   110 				if args[3] == 'clear' then
       
   111 					form_set ( id, field, nil )
       
   112 				else
       
   113 					args[1] = nil
       
   114 					args[2] = nil
       
   115 					if args[3] == 'set' then
       
   116 						args[3] = nil
       
   117 					end
       
   118 					form_set ( id, field, rebuild_args_string ( args ) )
       
   119 				end
       
   120 			else
       
   121 				print ( 'Form: ' .. ( forms[id].title or '' ) .. '\n' .. forms[id].exp )
       
   122 				print ( 'Fields:' )
       
   123 				for index, field in ipairs ( forms[id].val ) do -- this should not be here, but setting up callback just for this...
       
   124 					if field.type == 'jid-multi' or field.type == 'list-multi' or field.type == 'text-multi' then
       
   125 						print ( ' - ' .. field.var .. ' [' .. field.type .. ']:' )
       
   126 						for vin, value in ipairs ( field.value ) do
       
   127 							print ( '    * ' .. value[1] )
       
   128 						end
       
   129 					else
       
   130 						print ( ' - ' .. field.var .. ' [' .. field.type .. ']: ' .. field.value[1] )
       
   131 					end
       
   132 				end
       
   133 			end
       
   134 		elseif action == 'del' then
       
   135 			forms[tonumber(args[2])] = nil
       
   136 		elseif action == 'send' then
       
   137 			local form = forms[tonumber(args[2])]
       
   138 			if form then
       
   139 				form.send ( form )
       
   140 			end
       
   141 		else
       
   142 			print ( 'Forms list:' )
       
   143 			for id, form in ipairs ( forms ) do
       
   144 				print ( ' - ' .. tostring(id) .. ' ' .. form.title .. ' [' .. ( form.status or 'unknown' ) .. ']' )
       
   145 			end
       
   146 		end
       
   147 	end )
       
   148 
       
   149 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."
       
   150 
       
   151 -- vim: se ts=4: --