examples/ping.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Mon, 23 Mar 2009 04:17:02 +0200
changeset 60 b9fd051c0d7c
parent 55 9e32b6288c86
child 64 bf7521ed96eb
permissions -rw-r--r--
Ping fixes


-- XMPP PING (XEP-0199)

-- library

require 'lm'
require 'iq'

-- public

ping = { }

function ping.send ( conn, to, success, fail )
	iq.send ( conn, to, 'get',
		{
			ping = { xmlns = 'urn:xmpp:ping' },
		}, success, fail )
end

-- private

local ping_incoming_iq_handler = lm.message_handler.new (
	function ( conn, mess )
		local mtype, smtype = mess:type ()
		if smtype == 'get' then
			local p = mess:child ( 'ping' )
			if p and p:attribute ( 'xmlns' ) == 'urn:xmpp:ping' then
				conn:send ( lm.message.create { mtype = 'iq-result', to = mess:attribute ( 'from' ), id = mess:attribute ( 'id' ) } )
				return true
			end
		end
		return false
	end )

-- mcabber

main.command ( 'ping',
	function ( args )
		local who
		if args[1] then
			who = args[1]
		else
			who = main.full_jid ()
		end
		local time = os.time ()
		ping.send ( lm.connection.bless ( main.connection () ), who,
			function ()
				main.print_info ( who, ('Pong: %d seconds'):format ( os.time () - time ) )
			end,
			function ( mesg )
				main.print_info ( who, 'Ping failed: ' .. mesg )
			end )
	end, true, 'jid' )

--[[
local ping_handler_registered = false

hooks_d['hook-post-connect'].ping =
	function ( args )
		lm.connection.bless( main.connection () ):handler ( ping_incoming_iq_handler, 'iq', 'normal' )
		ping_handler_registered = true
		hooks_d['hook-post-connect'].ping = nil
		hooks_d['hook-quit'].ping =
			function ( args )
				if ping_handler_registered then
					lm.connection.bless( main.connection () ):handler ( ping_incoming_iq_handler, 'iq' )
				end
			end
	end

main.add_feature ( 'urn:xmpp:ping' )
--]]

-- vim: se ts=4: --