examples/avatar.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Mon, 23 Mar 2009 08:15:47 +0200
changeset 62 fb81aeb45e00
parent 54 b53355736057
child 66 542f61e113cb
permissions -rw-r--r--
Vcard and Evil
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
-- USER AVATAR (XEP-0084)
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 'sha1'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
require 'base64'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
require 'pubsub'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
require 'pep'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
-- public
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
avatar = { }
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
-- TODO 'temporary disabling'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
--          however I cannot see a method to enable it back without republishing avatar :(
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
--          this requires client to know, what is published on the server now
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
--          maybe we can do that by requesting item without payload from server
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
function avatar.publish ( conn, data, success, fail, height, width )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
	local id = sha1.digest ( data )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
	pep.publish ( conn, 'urn:xmpp:avatar:data',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
		{ id = id,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
			data = { xmlns = 'urn:xmpp:avatar:data',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
				base64.encode ( data ),
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
			},
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
		},
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
		function ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
			pep.publish ( conn, 'urn:xmpp:avatar:metadata',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
				{ id = id,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
					info = { bytes = data:len (), id = id, type = 'image/png', height = height, width = width },
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
				}, success, fail )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
		end, fail )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
function avatar.publish_url ( conn, url, iid, size, id, mtype, success, fail, height, width )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
	pep.publish ( conn, 'urn:xmpp:avatar:metadata',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
		{ id = iid,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
			info = { bytes = size, id = id, type = mtype, url = url, height = height, width = width },
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
		}, success, fail )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
function avatar.get ( conn, from, id, success, fail )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
	pubsub.retrieve ( conn, from, 'urn:xmpp:avatar:data',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
		function ( from, node, item )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
			local data = item:child ( 'data' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
			if data then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
				success ( data:value () )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
			else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
				-- XXX
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
		end, fail, nil, { id } )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
-- mcabber
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
pep.handlers['urn:xmpp:avatar:metadata'] =
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
	function ( from, node, data )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
		if not main.yesno ( main.option ( 'lua_pep_notification' ) ) then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
			return true
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
		local item = data:children ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
		while item do
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
			main.print_info ( from, ('Avatar: %s [%s] %s bytes, %sx%s %s'):format (
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
					item:attribute ( 'id' ),
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
					item:attribute ( 'type' ),
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
					item:attribute ( 'bytes' ),
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
					item:attribute ( 'width' ) or '?',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
					item:attribute ( 'height' ) or '?',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
					item:attribute ( 'url' ) or '' ) )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
			item = item:next ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
	end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
main.command ( 'avatar',
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
	function ( args )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
		local action = args[1]
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
		if action == 'get' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
			local who
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
			if args.t then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
				who = args.t
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
			else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
				who = main.current_buddy ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
			avatar.get ( lm.connection.bless ( main.connection () ), who, args[2],
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
				function ( data )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
					local h = io.open ( args[3], 'w' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
					if h then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
						h:write ( data )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
						h:close ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
						main.print_info ( who, 'Avatar saved to ' .. args[3] )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
					else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
						print ( 'Cannot open file for writing ' .. args[3] )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
					end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
				end,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
				function ( mesg )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
					main.print_info ( who, 'Error obtaining avatar: ' .. mesg )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
				end )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
		else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
			local file = action
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
			if action == 'set' then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
				file = args[2]
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
			local h = io.open ( file )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
			if h then
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
				data = h:read ( '*a' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
				h:close ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
				avatar.publish ( lm.connection.bless ( main.connection () ), data,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
					function ()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
						print ( 'Avatar published' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
					end,
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   113
					function ( mesg )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
						print ( 'Avatar publishing error: ' .. mesg )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
					end )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
			else
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
				print ( 'Cannot open file ' .. file )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   118
			end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
		end
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
	end, true, 'file' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
commands_help['avatar'] = '[-t jid] get id filename | [set] filename\n\nGet action tries to get from server avatar with specified id and save it to \'filename\'.\nSet action publishes avatar to server. File must be a PNG image.'
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
main.add_feature ( 'urn:xmpp:avatar:metadata+notify' )
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
-- vim: se ts=4: --