examples/xep0030.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Mon, 16 Mar 2009 19:57:51 +0200
changeset 35 8deda77c72e5
parent 34 8206d7cb1447
permissions -rw-r--r--
Pep and disco use user-supplied connection
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
35
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
     2
function disco_items ( connection, callback, what, node )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
	local request =
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
		lm.message.create { to = what, mtype = 'iq-get',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
			query = { xmlns = 'http://jabber.org/protocol/disco#items' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
		}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
	if node then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
		request:child( 'query' ):attribute ( 'node', node )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
	end
35
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    10
	return connection:send ( request,
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
		function ( conn, message )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
			if message:child ( 'error' ) then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
				callback ( message:child( 'error' ):children():name () )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
			else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
				local item = message:child( 'query' ):children ()
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
				local items = { }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
				while item do
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
					if item:name () == 'item' then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
						table.insert ( items, { jid = item:attribute ( 'jid' ), node = item:attribute ( 'node' ), name = item:attribute ( 'name' ) } )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
					end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
					item = item:next ()
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
				end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
				callback ( items )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
			end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
			return true
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
		end )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
35
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    29
function disco_info ( connection, callback, what )
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    30
	return connection:send (
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
		lm.message.create { to = what, mtype = 'iq-get',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
			query = { xmlns='http://jabber.org/protocol/disco#info' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
		},
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
		function ( conn, message )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
			local items_supported = false
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
			if message:child ( 'error' ) then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
				callback ( message:child( 'error' ):children():name () )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
			else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
				local item = message:child( 'query' ):children ()
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
				local identities = { }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
				local features   = { }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
				while item do
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
					if item:name () == 'identity' then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
						table.insert ( identities, { category = item:attribute ( 'category' ), type = item:attribute ( 'type' ), name = item:attribute ( 'name' ) } )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
					elseif item:name () == 'feature' then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
						table.insert ( features, item:attribute ( 'var' ) )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
					end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
					item = item:next ()
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
				end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
				callback ( identities, features )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
			end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
			return true
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
		end )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    56
main.command ( 'disco',
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
	function ( args )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
		local who
35
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    59
		local conn = lm.connection.bless ( main.connection () )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
		if args.t then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
			who = args.t
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
		else
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    63
			who = main.full_jid ()
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
		end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
		if args[1] == 'items' then
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    66
			local node = args[2]
35
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    67
			disco_items ( conn,
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
				function ( items )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
					if type ( items ) == 'string' then
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    70
						main.print_info ( who, ("Items service discovery for %s (%s) failed: %s"):format ( who, node or '', items ) )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
					else
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    72
						local text = ''
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
						for index, item in ipairs ( items ) do
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    74
							text = text .. ("\n    [%s (%s)] %s"):format ( item.jid or '', item.node or '', item.name or '' )
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    75
						end
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    76
						if text ~= '' then
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    77
							main.print_info ( who, ("Items service discovery result for %s (%s):%s"):format ( who, node or '', text ) )
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    78
						else
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    79
							main.print_info ( who, ("No items in discovery result for %s (%s)"):format ( who, node or '' ) )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
						end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
					end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
				end, who, node )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
		else
35
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    84
			disco_info ( conn,
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
				function ( identities, features )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
					if type ( identities ) == 'string' then
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    87
						main.print_info ( who, ("Info service discovery for %s failed: %s"):format ( who, identities ) )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
					else
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    89
						main.print_info ( who, ("Service info discovery result for %s:"):format ( who ) )
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    90
						local text = ''
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
						for index, identity in ipairs ( identities ) do
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    92
							text = text .. ("\n    [%s (%s)] %s"):format ( identity.category or '', identity.type or '', identity.name or '' )
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    93
						end
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    94
						if text ~= '' then
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    95
							main.print_info ( who, "  Identities:" .. text )
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    96
						else
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    97
							main.print_info ( who, "  No identities" )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
						end
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    99
						text = ''
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
						for index, feature in ipairs ( features ) do
28
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   101
							text = text .. ("\n    [%s]"):format ( feature or '' )
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   102
						end
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   103
						if text ~= '' then
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   104
							main.print_info ( who, "  Features:" .. text )
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   105
						else
90e52372b595 Merged disco output
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   106
							main.print_info ( who, "  No features" )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
						end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
					end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
				end, who )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
		end
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   111
	end, true, 'jid' )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
35
8deda77c72e5 Pep and disco use user-supplied connection
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
   113
commands_help['disco'] = "[-t target_jid] [info | items] [node]\n\nService discovery request.\nInfo is sent if omitted."
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
-- vim: se ts=4: --