examples/shortenurl.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Fri, 12 Oct 2012 21:24:44 +0300
changeset 136 2b04fad2f61a
parent 127 9157566033e8
child 141 1e36a08d7734
permissions -rw-r--r--
[examples] Fix non-table response handling in shortener Reported by Mikael Berthe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
--  SHORTENURL
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
-- uses:
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
--  * goo.gl (online service)
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
--  * curl (program)
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
--  * lua-json (https://github.com/harningt/luajson/)
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
--  * shell_escape (mcabberrc.lua)
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
--  * option lua_shorten_post_url
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
-- TODO:
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
--  * other backends
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
--  * detect curl/wget
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
--  * ensure curl will not mess screen up
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
--  * -s switch to send url automatically
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
local json = require 'json'
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
local encodeoptions = {
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
	strings = {
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
		encodeSet = '\\"%z\1-\031', -- do not escape /, google does not understand that
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
	}
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
}
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    24
local curlcommand = "curl -s https://www.googleapis.com/urlshortener/v1/url%s -H 'Content-type: application/json' -d %s"
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
main.command ( 'shorten',
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
	function ( args )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
		if ( not args ) or not args:match ( '%w' ) then
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
			print ( 'shorten: You must specify url' )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
			return
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
		end
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    34
		local jid         = main.current_buddy ()
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    35
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    36
		local querystring = ''
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    37
		local key         = main.option ( 'lua_shorten_googl_key' )
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    38
		if key and key:match ( '%w' ) then
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    39
			querystring   = '?key=' .. key
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    40
		end
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    41
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
		local replystring = ''
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    43
		
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    44
		main.bgread ( ( curlcommand ):format ( querystring, shell_escape ( json.encode ( { longUrl = args }, encodeoptions ) ) ),
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
			function ( data )
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    46
				if data then
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    47
					replystring = replystring .. data
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    48
					return true
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    49
				else -- eof
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
					local reply = json.decode ( replystring )
136
2b04fad2f61a [examples] Fix non-table response handling in shortener
Myhailo Danylenko <isbear@ukrpost.net>
parents: 127
diff changeset
    51
					if ( type ( reply ) == 'table' ) and reply.id then
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
						if jid and main.yesno ( main.option ( 'lua_shorten_post_url' ) ) then
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
							main.run ( ('say_to -q %s %s'):format ( jid, reply.id ) )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
						else
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
							print ( ('Shortened url: %s'):format ( reply.id ) )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
						end
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
					else
136
2b04fad2f61a [examples] Fix non-table response handling in shortener
Myhailo Danylenko <isbear@ukrpost.net>
parents: 127
diff changeset
    58
						if type ( reply ) == 'table' and ( type ( reply.error ) == 'table' ) then
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    59
							print ( ('Failed to shorten url: %u %s'):format ( reply.error.code, reply.error.message ) )
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    60
						else
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    61
							print ( ('Failed to shorten url: Unknown response:\n%s'):format ( replystring ) )
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    62
						end
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
					end
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
					return false
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
				end
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
			end )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
	end )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
-- vim: se ts=4 sw=4: --