Functions for downloading and removing images async. The magic of cackbacks ⭐ 🌟 ⭐
This commit is contained in:
parent
8ee6e8fd4f
commit
3df9d9c3f3
129
bot/utils.lua
129
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
|
@ -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
|
||||
|
||||
|
@ -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.",
|
||||
|
Reference in New Issue
Block a user