examples/shortenurl.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Wed, 28 Nov 2012 20:17:53 +0200
changeset 146 04d19c9c1196
parent 141 1e36a08d7734
permissions -rw-r--r--
Fix module loading problem
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
141
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    10
--  * switches -s or -n
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
-- TODO:
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
--  * other backends
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
--  * detect curl/wget
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
--  * ensure curl will not mess screen up
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
141
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    29
		local url  = args[1]
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    30
		local post = main.yesno ( main.option ( 'lua_shorten_post_url' ) )
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    31
		if not url then -- ugly. need to redesign argument parsing
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    32
			if args.s then
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    33
				url  = args.s
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    34
				post = true
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    35
			elseif args.n then
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    36
				url  = args.n
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    37
				post = false
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    38
			end
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    39
		end
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    40
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    41
		if ( not url ) or ( not url:match ( '%w' ) ) then
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
			print ( 'shorten: You must specify url' )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
			return
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
		end
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    46
		local jid         = main.current_buddy ()
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    47
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    48
		local querystring = ''
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    49
		local key         = main.option ( 'lua_shorten_googl_key' )
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    50
		if key and key:match ( '%w' ) then
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    51
			querystring   = '?key=' .. key
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    52
		end
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    53
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
		local replystring = ''
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    55
		
141
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    56
		main.bgread ( ( curlcommand ):format ( querystring, shell_escape ( json.encode ( { longUrl = url }, encodeoptions ) ) ),
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
			function ( data )
127
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    58
				if data then
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    59
					replystring = replystring .. data
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    60
					return true
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    61
				else -- eof
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
					local reply = json.decode ( replystring )
136
2b04fad2f61a [examples] Fix non-table response handling in shortener
Myhailo Danylenko <isbear@ukrpost.net>
parents: 127
diff changeset
    63
					if ( type ( reply ) == 'table' ) and reply.id then
141
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    64
						if jid and post then
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
							main.run ( ('say_to -q %s %s'):format ( jid, reply.id ) )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
						else
141
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    67
							print ( ('Full:  %s\n           Short: %s'):format ( url, reply.id ) )
125
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
					else
136
2b04fad2f61a [examples] Fix non-table response handling in shortener
Myhailo Danylenko <isbear@ukrpost.net>
parents: 127
diff changeset
    70
						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
    71
							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
    72
						else
9157566033e8 Support for goo.gl api key
Myhailo Danylenko <isbear@ukrpost.net>
parents: 126
diff changeset
    73
							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
    74
						end
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
					end
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
					return false
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
				end
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
			end )
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
141
1e36a08d7734 [examples] Add shortener -s and -n flags
Myhailo Danylenko <isbear@ukrpost.net>
parents: 136
diff changeset
    80
	end, true )
125
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
3e2421384d7a Examples updates (shortenurl)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
-- vim: se ts=4 sw=4: --