examples/oob.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Sun, 22 Mar 2009 05:49:14 +0200
changeset 51 a95a3a73482c
parent 48 d31ae73038f7
child 64 bf7521ed96eb
permissions -rw-r--r--
Pubsub uses new forms
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
-- OUT OF BAND DATA (XEP-0066)
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
-- library
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
require 'lm'
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
require 'iq'
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
-- public
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
oob = {
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
	handler =
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
		function ( from, url, desc, success, fail )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
			fail ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
		end,
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
}
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
function oob.send ( conn, to, url, success, fail, desc )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
	if desc then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
		desc = { desc }
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
	end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
	iq.send ( conn, to, 'set',
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
		{
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
			query = { xmlns = 'jabber:iq:oob',
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
				url  = { url },
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
				desc = desc,
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
			},
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
		}, success, fail )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
-- private
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
local oob_incoming_iq_handler = lm.message_handler.new (
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
	function ( conn, mess )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
		local mtype, smtype = mess:type ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
		if smtype == 'set' then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
			local query = mess:child ( 'query' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
			if query and query:attribute ( 'xmlns' ) == 'jabber:iq:oob' then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
				local from = mess:attribute ( 'from' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
				local url  = query:child( 'url' ):value ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
				local desc = query:child( 'desc' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
				if desc then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
					desc = desc:value ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
				end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
				oob.handler ( from, url, desc,
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
					function ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
						conn:send ( lm.message.create { mtype = 'iq-result', to = from, id = mess:attribute ( 'id' ) } )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
					end,
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
					function () -- XXX distinguish download error and reject
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
						conn:send (
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
							lm.message.create { mype = 'iq-error', to = from, id = mess:attribute ( 'id' ),
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
								-- XXX must we include query here?
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
								error = { code = '406', type = 'modify',
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
									['not-acceptable'] = { xmlns = 'urn:ietf:params:xml:ns:xmpp-stanzas' },
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
								},
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
							} )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
					end )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
				return true
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
			end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
		end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
		return false
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
	end )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
local oob_incoming_message_handler = lm.message_handler.new (
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
	function ( conn, mess )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
		local x = mess:child ( 'x' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
		if x and x:attribute ( 'xmlns' ) == 'jabber:x:oob' then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
			local from = mess:attribute ( 'from' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
			local url  = x:child( 'url' ):value ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
			local desc = x:child( 'desc' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
			if desc then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
				desc = desc:value ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
			end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
			oob.handler ( from, url, desc,
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
				function ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
				end,
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
				function ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
				end )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
		end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
		return false
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
	end )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
-- mcabber
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
oob.handler =
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
	function ( from, url, desc, success, fail )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
		if desc then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
			main.print_info ( from, 'Buddy wants you to download link: ' .. url .. ' (' .. desc .. ')' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
		else
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
			main.print_info ( from, 'Buddy wants you to download link: ' .. url )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
		end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
		success ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
	end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
main.command ( 'oob',
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
	function ( args )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
		local who
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
		if args.t then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
			who = args.t
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
		else
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
			who = main.full_jid ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
		end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
		-- here we can run something external to put file on server and obtain link to it
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
		oob.send ( lm.connection.bless ( main.connection () ), who, args[1],
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
			function ()
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
				main.print_info ( who, 'OOB link accepted' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
			end,
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
			function ( mesg )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
				main.print_info ( who, 'OOB link refused: ' .. mesg )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
			end, args[2] )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
	end, true )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
local oob_handler_registered = false
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   113
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
hooks_d['hook-post-connect'].oob =
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
	function ( args )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
		local conn = lm.connection.bless ( main.connection () )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
		conn:handler ( oob_incoming_iq_handler, 'iq', 'normal' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   118
		conn:handler ( oob_incoming_message_handler, 'message', 'normal' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
		conn:handler ( oob_incoming_message_handler, 'presence', 'normal' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
		oob_handler_registered = true
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
		hooks_d['hook-post-connect'].oob = nil
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
		hooks_d['hook-quit'].oob =
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
			function ( args )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
				if oob_handler_registered then
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
					local conn = lm.connection.bless ( main.connection () )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
					conn:handler ( oob_incoming_iq_handler, 'iq' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
					conn:handler ( oob_incoming_message_handler, 'message' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
					conn:handler ( oob_incoming_message_handler, 'presence' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
				end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
			end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
	end
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
main.add_feature ( 'jabber:iq:oob' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
main.add_feature ( 'jabber:x:oob' )
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
d31ae73038f7 OOB uses module interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
-- vim: se ts=4: --