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: -- |
|