scripts/xep0030.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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
function disco_items ( callback, what, node )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
	local request =
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
		lm.message.create { to = what, mtype = 'iq-get',
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
			query = { xmlns = 'http://jabber.org/protocol/disco#items' }
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
		}
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
	if node then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
		request:child( 'query' ):attribute ( 'node', node )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
	end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
	return lm.connection.bless( main.connection () ):send ( request,
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
		function ( conn, message )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
			if message:child ( 'error' ) then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
				callback ( message:child( 'error' ):children():name () )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
			else
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
				local item = message:child( 'query' ):children ()
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
				local items = { }
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
				while item do
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
					if item:name () == 'item' then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
						table.insert ( items, { jid = item:attribute ( 'jid' ), node = item:attribute ( 'node' ), name = item:attribute ( 'name' ) } )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
					end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
					item = item:next ()
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
				end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
				callback ( items )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
			end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
			return true
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
		end )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
function disco_info ( callback, what )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
	return lm.connection.bless( main.connection () ):send (
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
		lm.message.create { to = what, mtype = 'iq-get',
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
			query = { xmlns='http://jabber.org/protocol/disco#info' }
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
		},
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
		function ( conn, message )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
			local items_supported = false
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
			if message:child ( 'error' ) then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
				callback ( message:child( 'error' ):children():name () )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
			else
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
				local item = message:child( 'query' ):children ()
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
				local identities = { }
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
				local features   = { }
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
				while item do
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
					if item:name () == 'identity' then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
						table.insert ( identities, { category = item:attribute ( 'category' ), type = item:attribute ( 'type' ), name = item:attribute ( 'name' ) } )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
					elseif item:name () == 'feature' then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
						table.insert ( features, item:attribute ( 'var' ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
					end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
					item = item:next ()
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
				end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
				callback ( identities, features )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
			end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
			return true
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
		end )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
main.add_command ( 'disco',
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
	function ( args )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
		args = parse_args ( args )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
		local who
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
		if args.t then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
			who = args.t
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
			args.t = nil
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
		else
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
			who = full_current_jid ()
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
		end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
		if args[1] == 'items' then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
			local node = nil
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
			if args[2] then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
				args[1] = nil
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
				node = rebuild_args_string ( args )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
			end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
			disco_items (
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
				function ( items )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
					if type ( items ) == 'string' then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
						main.print_info ( who, string.format ( "Service items discovery for %s (%s) failed: %s", who, node or '', items ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
					else
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
						main.print_info ( who, string.format ( "Service items discovery result for %s (%s):", who, node or '' ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
						for index, item in ipairs ( items ) do
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
							main.print_info ( who, string.format ( "    [%s (%s)] %s", item.jid or '', item.node or '', item.name or '' ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
						end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
					end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
				end, who, node )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
		else
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
			disco_info (
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
				function ( identities, features )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
					if type ( identities ) == 'string' then
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
						main.print_info ( who, string.format ( "Service info discovery for %s failed: %s", who, identities ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
					else
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
						main.print_info ( who, string.format ( "Service info discovery result for %s:", who ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
						main.print_info ( who, "  Identities:" )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
						for index, identity in ipairs ( identities ) do
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
							main.print_info ( who, string.format ( "    [%s (%s)] %s", identity.category or '', identity.type or '', identity.name or '' ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
						end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
						main.print_info ( who, "  Features:" )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
						for index, feature in ipairs ( features ) do
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
							main.print_info ( who, string.format ( "    [%s]", feature or '' ) )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
						end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
					end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
				end, who )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
		end
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
	end )
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
commands_help['disco'] = "[-t target_jid] [info | items] [node]\n\nService discovery request.\nInfo is sent if omitted.\nIf info reveals, that buddy can do items, items request also will be sent."
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
bca17e4a9851 Added sample configuration files
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
-- vim: se ts=4: --