2015-12-05 10:03:43 -05: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.
2016-04-11 20:55:46 -07:00
-- You must also sign up for the CSE in the Google Developer Console, and enable image results.
2015-12-05 10:03:43 -05:00
2016-04-10 21:04:47 -07:00
local gImages = { }
local HTTPS = require ( ' ssl.https ' )
local URL = require ( ' socket.url ' )
2016-04-15 19:07:23 +00:00
local JSON = require ( ' dkjson ' )
2016-06-07 00:31:34 -04:00
local utilities = require ( ' otouto.utilities ' )
2016-04-10 21:04:47 -07:00
2016-05-26 17:26:30 -07:00
function gImages : init ( config )
2016-08-13 22:46:18 -04: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-10 21:04:47 -07:00
2016-08-13 22:46:18 -04: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 05:03:35 -04: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-13 22:46:18 -04: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
2015-12-05 10:03:43 -05:00
end
2016-04-10 21:04:47 -07:00
gImages.command = ' image <query> '
2015-07-02 18:15:52 -04:00
2016-05-26 17:26:30 -07:00
function gImages : action ( msg , config )
2015-07-02 18:15:52 -04:00
2016-08-13 22:46:18 -04:00
local input = utilities.input_from_msg ( msg )
if not input then
2016-08-23 00:16:32 -04:00
utilities.send_reply ( msg , gImages.doc , true )
2016-08-13 22:46:18 -04:00
return
end
2015-07-02 18:15:52 -04:00
2016-08-13 22:46:18 -04:00
local url = gImages.search_url
2015-11-24 21:22:04 -05:00
2016-08-13 22:46:18 -04:00
if not string.match ( msg.text , ' ^ ' .. config.cmd_pat .. ' i[mage]*nsfw ' ) then
url = url .. ' &safe=high '
end
2015-07-02 18:15:52 -04:00
2016-08-13 22:46:18 -04:00
url = url .. ' &q= ' .. URL.escape ( input )
2015-07-02 18:15:52 -04:00
2016-08-13 22:46:18 -04:00
local jstr , res = HTTPS.request ( url )
if res ~= 200 then
2016-08-23 00:16:32 -04:00
utilities.send_reply ( msg , config.errors . connection )
2016-08-13 22:46:18 -04:00
return
end
2015-07-02 18:15:52 -04:00
2016-08-13 22:46:18 -04:00
local jdat = JSON.decode ( jstr )
if jdat.searchInformation . totalResults == ' 0 ' then
2016-08-23 00:16:32 -04:00
utilities.send_reply ( msg , config.errors . results )
2016-08-13 22:46:18 -04:00
return
end
2015-07-02 18:15:52 -04:00
2016-08-13 22:46:18 -04: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 15:39:00 -03:00
2015-07-02 18:15:52 -04:00
2016-08-13 22:46:18 -04:00
if msg.text : match ( ' nsfw ' ) then
2016-08-23 00:16:32 -04:00
utilities.send_reply ( ' *NSFW* \n ' .. msg , output )
2016-08-13 22:46:18 -04:00
else
2016-08-23 00:16:32 -04:00
utilities.send_message ( msg.chat . id , output , false , nil , true )
2016-08-13 22:46:18 -04:00
end
2015-07-02 18:15:52 -04:00
end
2016-04-10 21:04:47 -07:00
return gImages