diff --git a/bot/utils.lua b/bot/utils.lua index 0b8c37e..3c5080b 100644 --- a/bot/utils.lua +++ b/bot/utils.lua @@ -649,6 +649,14 @@ function cache_data(plugin, query, data, timeout, typ) print('Caching "'..query..'" from plugin '..plugin..' (expires in '..timeout..' seconds)') if typ == 'key' then redis:set(hash, data) + elseif typ == 'set' then + -- make sure that you convert your data into a table: + -- {"foo", "bar", "baz"} instead of + -- {"bar" = "foo", "foo" = "bar", "bar" = "baz"} + -- because other formats are not supported by redis (or I haven't found a way to store them) + for _,str in pairs(data) do + redis:sadd(hash, str) + end else redis:hmset(hash, data) end diff --git a/plugins/img_google.lua b/plugins/img_google.lua index 7bebcea..3254803 100644 --- a/plugins/img_google.lua +++ b/plugins/img_google.lua @@ -1,124 +1,173 @@ +-- This is a proprietary plugin, property of Andreas Bielawski, (c) 2015 +-- DO NOT USE WITHOUT PERMISSION + do -local mime = require("mime") -local google_config = load_from_file('data/google.lua') -local cache = {} - ---[[ -local function send_request(url) - local t = {} - local options = { - url = url, - sink = ltn12.sink.table(t), - method = "GET" - } - local a, code, headers, status = http.request(options) - return table.concat(t), code, headers, status -end]]-- - -local function get_google_data(text) ---[[ - local url = "http://ajax.googleapis.com/ajax/services/search/images?" - url = url.."v=1.0&rsz=5" - url = url.."&q="..URL.escape(text) - url = url.."&imgsz=small|medium|large" ---]] - - if not google_config.cx then - print "cx not present in config file" - return nil - end - - local url = "https://www.googleapis.com/customsearch/v1?" - url = url.."cx="..google_config.cx - url = url.."&searchType=image&safe=high" - url = url.."&q="..URL.escape(text) - - if google_config.api_keys then - local i = math.random(#google_config.api_keys) - local api_key = google_config.api_keys[i] - if api_key then - url = url.."&key="..api_key - end - end +local _blacklist +local function getGoogleImage(text) + local apikey = cred_data.google_apikey + local cseid = cred_data.google_cse_id + local url = 'https://www.googleapis.com/customsearch/v1?cx='..cseid..'&key='..apikey..'&searchType=image&num=10&fields=items(link)&safe=high&q='..URL.escape(text) local res, code = https.request(url) + if code ~= 200 then return nil end - if code ~= 200 then - print("HTTP Error code:", code) - return nil - end - - local google = json:decode(res) + local google = json:decode(res).items return google end --- Returns only the useful google data to save on cache -local function simple_google_table(google) - local new_table = {} - new_table.responseData = {} - new_table.responseDetails = google.responseDetails - new_table.responseStatus = google.responseStatus - new_table.responseData.results = {} - local results = google.responseData.results - for k,result in pairs(results) do - new_table.responseData.results[k] = {} - new_table.responseData.results[k].unescapedUrl = result.unescapedUrl - new_table.responseData.results[k].url = result.url - end - return new_table -end - -local function save_to_cache(query, data) - -- Saves result on cache - if string.len(query) <= 7 then - local text_b64 = mime.b64(query) - if not cache[text_b64] then --- local simple_google = simple_google_table(data) - cache[text_b64] = data +local function is_blacklisted(msg) + local var = false + for v,word in pairs(_blacklist) do + if string.find(string.lower(msg), string.lower(word)) then + print("Wort steht auf der Blacklist!") + var = true + break end end + return var end -local function process_google_data(google, receiver, query) - - if not google or not google.items or #google.items == 0 then - local text = 'Image not found.' - send_msg(receiver, text, ok_cb, false) - return false +local function show_blacklist() + if not _blacklist[1] then + return "Keine Wörter geblacklisted!\nBlackliste welche mit !imgblacklist add [Wort]" + else + local sort_alph = function( a,b ) return a < b end + table.sort( _blacklist, sort_alph ) + local blacklist = "Folgende Wörter stehen auf der Blacklist:\n" + for v,word in pairs(_blacklist) do + blacklist = blacklist..'- '..word..'\n' + end + return blacklist end +end - local i = math.random(#google.items) - local url = google.items[i].link - local old_timeout = https.TIMEOUT or 10 - http.TIMEOUT = 10 - send_photo_from_url(receiver, url) - http.TIMEOUT = old_timeout +local function add_blacklist() + print('Blacklisting '..word..' - saving to redis set telegram:img_blacklist') + if redis:sismember("telegram:img_blacklist", word) == true then + return '"'..word..'" steht schon auf der Blacklist.' + else + redis:sadd("telegram:img_blacklist", word) + return '"'..word..'" blacklisted!' + end +end - save_to_cache(query, google) +local function remove_blacklist() + print('De-blacklisting '..word..' - removing from redis set telegram:img_blacklist') + if redis:sismember("telegram:img_blacklist", word) == true then + redis:srem("telegram:img_blacklist", word) + return '"'..word..'" erfolgreich von der Blacklist gelöscht!' + else + return '"'..word..'" steht nicht auf der Blacklist.' + end +end +local function cache_google_image(results, text) + local cache = {} + for v in pairs(results) do + table.insert(cache, results[v].link) + end + cache_data('img_google', string.lower(text), cache, 1209600, 'set') end function run(msg, matches) local receiver = get_receiver(msg) local text = matches[1] - local text_b64 = mime.b64(text) - local cached = cache[text_b64] - if cached then - process_google_data(cached, receiver, text) - else - local data = get_google_data(text) - process_google_data(data, receiver, text) + if matches[2] then word = string.lower(matches[2]) end + + _blacklist = redis:smembers("telegram:img_blacklist") + + if text == "/imgblacklist show" then + if is_sudo(msg) then + return show_blacklist() + else + return "Du bist kein Superuser. Dieser Vorfall wird gemeldet!" + end + end + + if text == "/imgblacklist add" and word == nil then + return "Benutzung: !imgblacklist add [Wort]" + elseif text == "!imgblacklist add" and word then + if is_sudo(msg) then + return add_blacklist() + else + return "Du bist kein Superuser. Dieser Vorfall wird gemeldet!" + end + end + + if text == "/imgblacklist remove" and word == nil then + return "Benutzung: !imgblacklist remove [Wort]" + elseif text == "!imgblacklist remove" and word then + if is_sudo(msg) then + return remove_blacklist() + else + return "Du bist kein Superuser. Dieser Vorfall wird gemeldet!" + end + end + + print ('Checking if search contains blacklisted words: '..text) + if is_blacklisted(text) then + return "Vergiss es ._." + end + + local hash = 'telegram:cache:img_google:'..string.lower(text) + local results = redis:smembers(hash) + if not results[1] then + print('doing web request') + results = getGoogleImage(text) + if not results then + return "Kein Bild gefunden!" + end + cache_google_image(results, text) + end + -- Random image from table + local i = math.random(#results) + local url = nil + + local failed = true + local nofTries = 0 + while failed and nofTries < #results do + if not results[i].link then + url = results[i] + else + url = results[i].link + end + print("Bilder-URL: ", url) + + if string.ends(url, ".gif") then + failed = not send_document_from_url(receiver, url, nil, nil, true) + return 'Source: '..url + elseif string.ends(url, ".jpg") or string.ends(url, ".jpeg") or string.ends(url, ".png") then + failed = not send_photo_from_url(receiver, url, nil, nil, true) + return 'Source: '..url + end + + nofTries = nofTries + 1 + i = i+1 + if i > #results then + i = 1 + end + end + + if failed then + return "Fehler beim Herunterladen eines Bildes." end end return { - description = "", - usage = "", - patterns = { - "^/img (.*)$" + description = "Sucht Bild mit Google-API und versendet es (SafeSearch aktiv)", + usage = { + "/img [Suchbegriff]", + "/imgblacklist show: Zeigt Blacklist (nur Superuser)", + "/imgblacklist add [Wort]: Fügt Wort der Blacklist hinzu (nur Superuser)", + "/imgblacklist remove [Wort]: Entfernt Wort aus der Blacklist (nur Superuser)" }, - run = run + patterns = { + "^/img (.*)$", + "^(/imgblacklist show)$", + "^(/imgblacklist add) (.*)$", + "^(/imgblacklist remove) (.*)$" + }, + run = run } - -end +end \ No newline at end of file diff --git a/plugins/img_google_nsfw.lua b/plugins/img_google_nsfw.lua new file mode 100644 index 0000000..a4c5a22 --- /dev/null +++ b/plugins/img_google_nsfw.lua @@ -0,0 +1,119 @@ +-- This is a proprietary plugin, property of Andreas Bielawski, (c) 2015 +-- DO NOT USE WITHOUT PERMISSION + +do + +local _blacklist + +local function getNSFWImage(text) + local apikey = cred_data.google_apikey + local cseid = cred_data.google_cse_id + local url = 'https://www.googleapis.com/customsearch/v1?cx='..cseid..'&key='..apikey..'&searchType=image&num=10&fields=items(link)&q='..URL.escape(text) + local res, code = https.request(url) + if code ~= 200 then return nil end + + local google = json:decode(res).items + return google +end + +local function is_blacklisted(msg) + local var = false + for v,word in pairs(_blacklist) do + if string.find(string.lower(msg), string.lower(word)) then + print("Wort steht auf der Blacklist!") + var = true + break + end + end + return var +end + +local function show_blacklist() + if not _blacklist[1] then + return "Keine Wörter geblacklisted!\nBlackliste welche mit !imgblacklist add [Wort]" + else + local sort_alph = function( a,b ) return a < b end + table.sort( _blacklist, sort_alph ) + local blacklist = "Folgende Wörter stehen auf der Blacklist:\n" + for v,word in pairs(_blacklist) do + blacklist = blacklist..'- '..word..'\n' + end + return blacklist + end +end + +local function cache_nsfw_image(results, text) + local cache = {} + for v in pairs(results) do + table.insert(cache, results[v].link) + end + cache_data('img_google_nsfw', string.lower(text), cache, 1209600, 'set') +end + +function run(msg, matches) + local receiver = get_receiver(msg) + local text = matches[1] + if matches[2] then word = string.lower(matches[2]) end + + _blacklist = redis:smembers("telegram:img_blacklist") + + print ('Checking if search contains blacklisted words: '..text) + if is_blacklisted(text) then + return "Vergiss es ._." + end + + local hash = 'telegram:cache:img_google_nsfw:'..string.lower(text) + local results = redis:smembers(hash) + if not results[1] then + print('doing web request') + results = getNSFWImage(text) + if not results then + return "Kein Bild gefunden!" + end + cache_nsfw_image(results, text) + end + -- Random image from table + local i = math.random(#results) + local url = nil + + local failed = true + local nofTries = 0 + while failed and nofTries < #results do + if not results[i].link then + url = results[i] + else + url = results[i].link + end + print("Bilder-URL: ", url) + + if string.ends(url, ".gif") then + failed = not send_document_from_url(receiver, url, nil, nil, true) + return 'Source: '..url + elseif string.ends(url, ".jpg") or string.ends(url, ".jpeg") or string.ends(url, ".png") then + failed = not send_photo_from_url(receiver, url, nil, nil, true) + return 'Source: '..url + end + + nofTries = nofTries + 1 + i = i+1 + if i > #results then + i = 1 + end + end + + if failed then + return "Fehler beim Herunterladen eines Bildes." + end +end + +return { + description = "Sucht Bild mit Google-API und versendet es", + usage = { + "/img2 [Suchbegriff]" + }, + patterns = { + "^/img2 (.*)$" + }, + run = run +} +end \ No newline at end of file