2016-09-29 20:57:54 +02:00
--[[
You need a Google API key and a Google Custom Search Engine set up to use
this , in config.google_api_key and config.google_cse_key , respectively . You
must also sign up for the CSE in the Google Developer Console , and enable
image results .
] ] --
2015-12-05 16:03:43 +01:00
2016-04-11 06:04:47 +02:00
local gImages = { }
local HTTPS = require ( ' ssl.https ' )
local URL = require ( ' socket.url ' )
2016-04-15 21:07:23 +02:00
local JSON = require ( ' dkjson ' )
2016-06-07 06:31:34 +02:00
local utilities = require ( ' otouto.utilities ' )
2016-04-11 06:04:47 +02:00
2016-05-27 02:26:30 +02:00
function gImages : init ( config )
2016-08-14 04:46:18 +02:00
assert ( config.google_api_key and config.google_cse_key ,
' gImages.lua requires a Google API key from http://console.developers.google.com and a Google Custom Search Engine key from http://cse.google.com/cse. '
)
2016-04-11 06:04:47 +02:00
2016-08-14 04:46:18 +02:00
gImages.triggers = utilities.triggers ( self.info . username , config.cmd_pat ) : t ( ' image ' , true ) : t ( ' i ' , true ) : t ( ' insfw ' , true ) . table
gImages.doc = config.cmd_pat .. [ [ image < query >
2016-07-25 11:03:35 +02:00
Returns a randomized top result from Google Images . Safe search is enabled by default ; use " ]] .. config.cmd_pat .. [[insfw " to disable it . NSFW results will not display an image preview .
Alias : ] ] .. config.cmd_pat .. ' i '
2016-08-14 04:46:18 +02:00
gImages.search_url = ' https://www.googleapis.com/customsearch/v1?&searchType=image&imgSize=xlarge&alt=json&num=8&start=1&key= ' .. config.google_api_key .. ' &cx= ' .. config.google_cse_key
2016-09-09 11:13:20 +02:00
-- Put this up here in case config changes after triggers are generated.
gImages.nsfw_trigger = ' ^ ' .. config.cmd_pat .. ' insfw '
2015-12-05 16:03:43 +01:00
end
2016-04-11 06:04:47 +02:00
gImages.command = ' image <query> '
2015-07-03 00:15:52 +02:00
2016-05-27 02:26:30 +02:00
function gImages : action ( msg , config )
2015-07-03 00:15:52 +02:00
2016-08-14 04:46:18 +02:00
local input = utilities.input_from_msg ( msg )
if not input then
2016-08-23 06:16:32 +02:00
utilities.send_reply ( msg , gImages.doc , true )
2016-08-14 04:46:18 +02:00
return
end
2015-07-03 00:15:52 +02:00
2016-08-14 04:46:18 +02:00
local url = gImages.search_url
2015-11-25 03:22:04 +01:00
2016-08-14 04:46:18 +02:00
if not string.match ( msg.text , ' ^ ' .. config.cmd_pat .. ' i[mage]*nsfw ' ) then
url = url .. ' &safe=high '
end
2015-07-03 00:15:52 +02:00
2016-08-14 04:46:18 +02:00
url = url .. ' &q= ' .. URL.escape ( input )
2015-07-03 00:15:52 +02:00
2016-08-14 04:46:18 +02:00
local jstr , res = HTTPS.request ( url )
if res ~= 200 then
2016-08-23 06:16:32 +02:00
utilities.send_reply ( msg , config.errors . connection )
2016-08-14 04:46:18 +02:00
return
end
2015-07-03 00:15:52 +02:00
2016-08-14 04:46:18 +02:00
local jdat = JSON.decode ( jstr )
if jdat.searchInformation . totalResults == ' 0 ' then
2016-08-23 06:16:32 +02:00
utilities.send_reply ( msg , config.errors . results )
2016-08-14 04:46:18 +02:00
return
end
2015-07-03 00:15:52 +02:00
2016-08-14 04:46:18 +02:00
local i = math.random ( jdat.queries . request [ 1 ] . count )
local img_url = jdat.items [ i ] . link
local img_title = jdat.items [ i ] . title
local output = ' [ ' .. img_title .. ' ]( ' .. img_url .. ' ) '
2016-01-17 19:39:00 +01:00
2015-07-03 00:15:52 +02:00
2016-09-09 11:15:00 +02:00
if msg.text_lower : match ( gImages.nsfw_trigger ) then
2016-09-29 20:57:54 +02:00
utilities.send_message ( msg.chat . id , ' *NSFW* \n ' .. output , true , msg.message_id , true )
2016-08-14 04:46:18 +02:00
else
2016-09-29 20:57:54 +02:00
utilities.send_message ( msg.chat . id , output , false , msg.message_id , true )
2016-08-14 04:46:18 +02:00
end
2015-07-03 00:15:52 +02:00
end
2016-04-11 06:04:47 +02:00
return gImages