diff --git a/bot/utils.lua b/bot/utils.lua index 49f5b02..85943be 100644 --- a/bot/utils.lua +++ b/bot/utils.lua @@ -1,3 +1,5 @@ +local ltn12 = require "ltn12" + function get_receiver(msg) if msg.to.type == 'user' then return 'user#id'..msg.from.id @@ -15,7 +17,6 @@ function is_chat_msg( msg ) end function string.random(length) - math.randomseed(os.time()) local str = ""; for i = 1, length do math.random(97, 122) @@ -36,46 +37,31 @@ function string.trim(s) return s:gsub("^%s*(.-)%s*$", "%1") end -function download_to_file( url , noremove ) +-- Saves file to /tmp/. If file_name isn't provided, +-- will get the text after the last "/" for filename. +function download_to_file(url, file_name) print("url to download: "..url) - local ltn12 = require "ltn12" - local respbody = {} - one, c, h = http.request{url=url, sink=ltn12.sink.table(respbody), redirect=true} - htype = h["content-type"] - if htype == "image/jpeg" then - file_name = string.random(5)..".jpg" - file_path = "/tmp/"..file_name - else - if htype == "image/gif" then - file_name = string.random(5)..".gif" - file_path = "/tmp/"..file_name - else - if htype == "image/png" then - file_name = string.random(5)..".png" - file_path = "/tmp/"..file_name - else - file_name = url:match("([^/]+)$") - file_path = "/tmp/"..file_name - end - end - end + local respbody = {} + local options = { + url = url, + sink = ltn12.sink.table(respbody), + redirect = true + } + + local one, c, h = http.request(options) + + -- Everything after the last / + local file_name = url:match("([^/]+)$") + local file_path = "/tmp/"..file_name + file = io.open(file_path, "w+") file:write(table.concat(respbody)) file:close() - if noremove == nil then - print(file_path.."will be removed in 20 seconds") - postpone(rmtmp_cb, file_path, 20) - end - return file_path end --- Callback to remove a file -function rmtmp_cb(file_path, success, result) - os.remove(file_path) -end function vardump(value, depth, key) local linePrefix = "" @@ -191,7 +177,84 @@ function string:isempty() return self == nil or self == '' end - +-- Returns true if String starts with Start function string.starts(String, Start) return Start == string.sub(String,1,string.len(Start)) +end + +-- Send image to user and delete it when finished. +-- cb_function and cb_extra are optionals callback +function _send_photo(receiver, file_path, cb_function, cb_extra) + local cb_extra = { + file_path = file_path, + cb_function = cb_function, + cb_extra = cb_extra + } + -- Call to remove with optional callback + send_photo(receiver, file_path, rmtmp_cb, cb_extra) +end + +-- Download the image and send to receiver, it will be deleted. +function send_photo_from_url(receiver, url) + local file_path = download_to_file(url, false) + print("File path: "..file_path) + _send_photo(receiver, file_path) +end + +-- Send multimple images asynchronous. +-- param urls must be a table. +function send_photos_from_url(receiver, urls) + local cb_extra = { + receiver = receiver, + urls = urls, + remove_path = nil + } + send_photos_from_url_callback(cb_extra) +end + +-- Use send_photos_from_url. +-- This fuction might be difficult to understand. +function send_photos_from_url_callback(cb_extra, success, result) + -- cb_extra is a table containing receiver, urls and remove_path + local receiver = cb_extra.receiver + local urls = cb_extra.urls + local remove_path = cb_extra.remove_path + + -- The previously image to remove + if remove_path ~= nil then + os.remove(remove_path) + print("Deleted: "..remove_path) + end + + -- Nil or empty, exit case (no more urls) + if urls == nil or #urls == 0 then + return false + end + + -- Take the head and remove from urls table + local head = table.remove(urls, 1) + + local file_path = download_to_file(head, false) + local cb_extra = { + receiver = receiver, + urls = urls, + remove_path = file_path + } + + -- Send first and postpone the others as callback + send_photo(receiver, file_path, send_photos_from_url_callback, cb_extra) +end + +-- Callback to remove a file +function rmtmp_cb(cb_extra, success, result) + local file_path = cb_extra.file_path + local cb_function = cb_extra.cb_function + local cb_extra = cb_extra.cb_extra + + if file_path ~= nil then + os.remove(file_path) + print("Deleted: "..file_path) + end + -- Finaly call the callback + cb_function(cb_extra, success, result) end \ No newline at end of file diff --git a/plugins/9gag.lua b/plugins/9gag.lua index 0d4a4f3..8544806 100644 --- a/plugins/9gag.lua +++ b/plugins/9gag.lua @@ -22,7 +22,7 @@ function run(msg, matches) local receiver = get_receiver(msg) url, title = get_9GAG() file_path = download_to_file(url) - send_photo(receiver, file_path, send_title, {receiver, title}) + _send_photo(receiver, file_path, send_title, {receiver, title}) return false end diff --git a/plugins/twitter.lua b/plugins/twitter.lua index f7c15f0..2de6645 100644 --- a/plugins/twitter.lua +++ b/plugins/twitter.lua @@ -59,14 +59,10 @@ function run(msg, matches) -- send the parts local receiver = get_receiver(msg) send_msg(receiver, header .. "\n" .. text, ok_cb, false) - for k, v in pairs(images) do - local file = download_to_file(v) - send_photo(receiver, file, ok_cb, false) - delay_s(1) - end - + send_photos_from_url(receiver, images) return nil end + return { description = "When user sends twitter URL, send text and images to origin. Requieres OAuth Key.",