examples/iq_register.lua
changeset 68 742878c74b8e
parent 67 d33ca5572e91
child 69 ab6d4ee8974c
equal deleted inserted replaced
67:d33ca5572e91 68:742878c74b8e
     1 
       
     2 -- IN-BAND REGISTRATION (XEP-0077)
       
     3 
       
     4 -- library
       
     5 
       
     6 local iq         = require 'iq'
       
     7 local x_data     = require 'x_data'
       
     8 local form_field = require 'form_field'
       
     9 
       
    10 --
       
    11 
       
    12 local F = { }
       
    13 local M = { }
       
    14 M.__index = M
       
    15 
       
    16 function F.new ( args )
       
    17 	local form = {
       
    18 		xmlns        = 'jabber:iq:register',
       
    19 		ftype        = args.type or 'form',
       
    20 		registered   = args.registered,
       
    21 		-- XXX title
       
    22 		instructions = args.instructions,
       
    23 		x_data       = args.x_data,
       
    24 		f            = { },
       
    25 	}
       
    26 	setmetatable ( form, M )
       
    27 	return form
       
    28 end
       
    29 
       
    30 function F.parse ( query )
       
    31 	local instructions = query:child ( 'instructions' )
       
    32 	if instructions then
       
    33 		instructions = instructions:value ()
       
    34 	end
       
    35 	
       
    36 	local registered
       
    37 	if query:child ( 'registered' ) then
       
    38 		registered = true
       
    39 	end
       
    40 
       
    41 	local x = query:child ( 'x' )
       
    42 	if x and x:attribute ( 'xmlns' ) == 'jabber:x:data' then
       
    43 		return F.new { type = 'form', registered = registered, instructions = instructions, x_data = x_data.parse ( x ) }
       
    44 	end
       
    45 
       
    46 	local form = F.new { type = 'form', registered = registered, instructions = instructions }
       
    47 
       
    48 	local field = query:child ()
       
    49 	while field do
       
    50 		local name  = field:name ()
       
    51 		if name ~= 'instructions' and name ~= 'registered' then
       
    52 			form:add ( name, { type = 'text-single', value = field:value () or '' } )
       
    53 		end
       
    54 		field = field:next ()
       
    55 	end
       
    56 
       
    57 	return form
       
    58 end
       
    59 
       
    60 function M.type ( form )
       
    61 	return form.ftype
       
    62 end
       
    63 
       
    64 function M.desc ( form )
       
    65 	if form.x_data then
       
    66 		return form.x_data:desc ()
       
    67 	else
       
    68 		return form.title, form.instructions
       
    69 	end
       
    70 end
       
    71 
       
    72 function M.format ( form, root, format_as )
       
    73 	local ft = format_as or form:type ()
       
    74 
       
    75 	if form.x_data then
       
    76 		root.query = form.x_data:format ( { xmlns = 'jabber:iq:register' }, ft )
       
    77 	else
       
    78 		root.query = { xmlns = 'jabber:iq:register' }
       
    79 		for index, field in form:fields () do
       
    80 			root.query[field:name ()] = field:value ()
       
    81 		end
       
    82 	end
       
    83 
       
    84 	if ft == 'form' then
       
    85 		local title, instructions = form:desc ()
       
    86 		if instructions then
       
    87 			root.query.instructions = { instructions }
       
    88 		end
       
    89 		if form.registered then
       
    90 			root.query.registered = { }
       
    91 		end
       
    92 	end
       
    93 
       
    94 	return root
       
    95 end
       
    96 
       
    97 function M.fields ( form )
       
    98 	if form.x_data then
       
    99 		return form.x_data:fields ()
       
   100 	else
       
   101 		return ipairs ( form.f )
       
   102 	end
       
   103 end
       
   104 
       
   105 function M.add ( form, name, fld )
       
   106 	if form.x_data then
       
   107 		return form.x_data:add ( name, fld )
       
   108 	else
       
   109 		fld.var   = name
       
   110 		fld.index = #form.f + 1
       
   111 		local obj = form_field.new ( fld )
       
   112 		table.insert ( form.f, obj )
       
   113 		form.f[name] = obj
       
   114 		return obj
       
   115 	end
       
   116 end
       
   117 
       
   118 function M.field ( form, name )
       
   119 	if form.x_data then
       
   120 		return form.x_data:field ( name )
       
   121 	else
       
   122 		return form.f[name]
       
   123 	end
       
   124 end
       
   125 
       
   126 function F.register ( conn, to, success, fail )
       
   127 	iq.send ( conn, to, 'get',
       
   128 		{
       
   129 			query = { xmlns = 'jabber:iq:register' },
       
   130 		},
       
   131 		function ( mess )
       
   132 			local query = mess:child ( 'query' )
       
   133 			if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then
       
   134 				success ( F.parse ( query ),
       
   135 					function ( form, success, fail )
       
   136 						iq.send ( conn, to, 'set', form:format ( form, { }, 'submit' ), success , fail )
       
   137 					end,
       
   138 					function ( form, success, fail )
       
   139 						success ()
       
   140 					end )
       
   141 			end
       
   142 		end, fail )
       
   143 end
       
   144 
       
   145 function F.unregister ( conn, to, success, fail )
       
   146 	iq.send ( conn, to, 'set',
       
   147 		{
       
   148 			query = { xmlns = 'jabber:iq:register',
       
   149 				remove = { },
       
   150 			},
       
   151 		},
       
   152 		function ( mess )
       
   153 			success ()
       
   154 		end,
       
   155 		function ( mesg, mess )
       
   156 			local query = mess:child ( 'query' )
       
   157 			if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then
       
   158 				success ( F.parse ( query ),
       
   159 					function ( form, success, fail )
       
   160 						iq.send ( conn, to, 'set', form:format ( form, { }, 'submit' ), success, fail )
       
   161 					end,
       
   162 					function ( form, success, fail )
       
   163 						success ()
       
   164 					end )
       
   165 			else
       
   166 				fail ( mesg )
       
   167 			end
       
   168 		end )
       
   169 end
       
   170 
       
   171 return F
       
   172 
       
   173 -- vim: se ts=4: --