examples/ping.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Mon, 23 Mar 2009 02:01:16 +0200
changeset 55 9e32b6288c86
child 60 b9fd051c0d7c
permissions -rw-r--r--
Ping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
-- XMPP PING (XEP-0199)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
-- library
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
require 'lm'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
require 'iq'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
-- public
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
ping = { }
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
function ping.send ( conn, to, success, fail )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
	iq.send ( conn, to, 'get', success, fail )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
-- private
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
local ping_incoming_iq_handler = lm.message_handler.new (
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
	function ( conn, mess )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
		local mtype, smtype = mess:type ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
		if smtype == 'get' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
			local p = mess:child ( 'ping' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
			if p and p:attribute ( 'xmlns' ) == 'urn:xmpp:ping' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
				conn:send ( lm.message.create { mtype = 'iq-result', to = mess:attribute ( 'from' ), id = mess:attribute ( 'id' ) } )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
				return true
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
		return false
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
-- mcabber
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
main.command ( 'ping',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
	function ( args )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
		local who
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
		if args[1] then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
			who = args[1]
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
		else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
			who = main.full_jid ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
		local time = os.time ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
		ping.send ( lm.connection.bless ( main.connection () ), who,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
			function ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
				main.print_info ( ('Pong: %d seconds'):format ( os.time () - time ) )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
			end,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
			function ( mesg )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
				main.print_info ( 'Ping failed: ' .. mesg )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
			end )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
	end, true, 'jid' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
local ping_handler_registered = false
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
hooks_d['hook-post-connect'].ping =
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
	function ( args )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
		lm.connection.bless( main.connection () ):handler ( ping_incoming_iq_handler, 'iq', 'normal' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
		ping_handler_registered = true
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
		hooks_d['hook-post-connect'].ping = nil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
		hooks_d['hook-quit'].ping =
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
			function ( args )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
				if ping_handler_registered then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
					lm.connection.bless( main.connection () ):handler ( ping_incoming_iq_handler, 'iq' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
				end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
	end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
main.add_feature ( 'urn:xmpp:ping' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
-- vim: se ts=4: --