examples/xep0066.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Fri, 20 Mar 2009 19:38:12 +0200
changeset 39 0d43f33243cc
parent 37 b438d630a556
permissions -rw-r--r--
Minor aligning
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
-- OUT OF BAND DATA
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
-- we can do more - use external command to put file on server,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
-- read it's output for link, and then send that link.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
-- that will be much more convenient.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
function oob_send_link ( conn, to, url, desc )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
	if desc then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
		desc = { desc }
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
	end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
	conn:send (
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
		lm.message.create { mtype = 'iq-set', to = to,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
			query = { xmlns = 'jabber:iq:oob',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
				url = { url },
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
				desc = desc,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
			},
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
		},
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
		function ( conn, mess )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
			local mtype, smtype = mess:type ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
			if smtype == 'result' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
				main.print_info ( to, 'Url is successfully downloaded' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
			elseif smtype == 'error' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
				main.print_info ( to, 'Url is not accepted: ' .. mess:child( 'error' ):children():name () )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
			else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
				print ( 'Weird response to oob url: ' .. mess:xml () )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
				return false
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
			return true
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
		end )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
oob_incoming_iq_handler = lm.message_handler.new (
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
	function ( conn, mess )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
		local mtype, smtype = mess:type ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
		if smtype == 'set' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
			local query = mess:child ( 'query' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
			if query and query:attribute ( 'xmlns' ) == 'jabber:iq:oob' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
				local url  = query:child( 'url' ):value ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
				local desc = query:child( 'desc' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
				if desc then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
					desc = ('(%s)'):format ( desc:value () )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
				else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
					desc = ''
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
				end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
				main.print_info ( mess:attribute ( 'from' ), ('Buddy wants you to download url: %s %s'):format ( url, desc ) )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
				-- FIXME: in fact, we need to register file and after downloading (or rejecting) should send a notification to sender,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
				-- but first we need to develop common file infrastructure (as with forms, though even that still needs redesign)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
				-- however, to be nice (in hope, that others also would be nice to us :), we'll send reply right now.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
				-- this saves memory and resources for pending handlers on the other side.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
				conn:send ( lm.message.create { mtype = 'iq-result', to = mess:attribute ( 'from' ), id = mess:attribute ( 'id' ) } )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
				return true
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
		return false
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
	end )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
oob_incoming_message_handler = lm.message_handler.new (
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
	function ( conn, mess )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
		local x = mess:child ( 'x' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
		if x and x:attribute ( 'xmlns' ) == 'jabber:x:oob' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
			local url = x:child( 'url' ):value ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
			local desc = x:child( 'desc' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
			if desc then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
				desc = ('(%s)'):format ( desc:value () )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
			else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
				desc = ''
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
			main.print_info ( mess:attribute ( 'from' ), ('Attached url: %s %s'):format ( url, desc ) )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
		return false
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
	end )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
main.command ( 'oob',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
	function ( args )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
		local who
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
		if args.t then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
			who = args.t
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
		else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
			who = main.full_jid ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
		oob_send_link ( lm.connection.bless ( main.connection () ), who, args[1], args[2] )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
	end, true )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
oob_handler_registered = false
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
hooks_d['hook-post-connect'].xep0066 =
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
	function ( args )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
		local conn = lm.connection.bless ( main.connection () )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
		conn:handler ( oob_incoming_iq_handler, 'iq', 'normal' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
		conn:handler ( oob_incoming_message_handler, 'message', 'normal' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
		conn:handler ( oob_incoming_message_handler, 'presence', 'normal' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
		oob_handler_registered = true
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
		hooks_d['hook-post-connect'].xep0066 = nil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
		hooks_d['hook-quit'].xep0066 =
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
			function ( args )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
				if oob_handler_registered then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
					local conn = lm.connection.bless ( main.connection () )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
					conn:handler ( oob_incoming_iq_handler, 'iq' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
					conn:handler ( oob_incoming_message_handler, 'message' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
					conn:handler ( oob_incoming_message_handler, 'presence' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
				end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
	end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
main.add_feature ( 'jabber:iq:oob' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
main.add_feature ( 'jabber:x:oob' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
-- vim: se ts=4: --