This commit is contained in:
Jon Michael Aanes 2018-06-23 09:35:45 +02:00
commit d9c6a2a5d7
3 changed files with 101 additions and 40 deletions

View File

@ -46,11 +46,15 @@ local function safe_access (base, path)
end end
local function generic_request (...) local function generic_request (...)
--print('Request', ...)
local output, code, headers, status = https.request(...) local output, code, headers, status = https.request(...)
if status == nil and code ~= 'connection refused' then --print('Https', output, code, headers, status)
if code ~= nil and status ~= 'connection refused' then
return output, code, headers, status return output, code, headers, status
end end
return http.request(...) local output, code, headers, status = http.request(...)
--print('Http', output, code, headers, status)
return output, code, headers, status
end end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -262,19 +266,32 @@ end
-- Download file -- Download file
function internet.download_file (url, filename) function internet.download_file (url, filename)
-- retrieve the content of a URL, and store in filename
assert(type(url) == 'string')
assert(type(filename) == 'string')
if url:match '^file://' then if url:match '^file://' then
local path = url:match '^file://(.+)$' local path = url:match '^file://(.+)$'
os.execute('cp "'..path..'" "'..filename..'"') os.execute('cp "'..path..'" "'..filename..'"')
return return
end end
-- retrieve the content of a URL
local body, code = https.request(url) --local body, code, headers, status = generic_request(url)
if not body then error(('Https connection to "%s" failed, with error "%s"'):format(url, code)) end local body, code, headers, status = https.request(url)
if code ~= 200 then
return false, code
--error(('Connection to "%s" failed, with error "%s"'):format(url, status))
end
assert(type(body) == 'string')
-- save the content to a file -- save the content to a file
local f = assert(io.open(filename, 'wb')) -- open in "binary" mode local f = assert(io.open(filename, 'wb')) -- open in "binary" mode
f:write(body) f:write(body)
f:close() f:close()
return true
end end
function internet.download_video (url) function internet.download_video (url)

View File

@ -106,15 +106,9 @@ local ERROR_MSG = {
'Jeg forstod... noget af det', 'Jeg forstod... noget af det',
'/me kigger rundt forvirret', '/me kigger rundt forvirret',
'Ahvad?', 'Ahvad?',
'Kan du ikke lige gentage det, på en bedre måde?',
'Hvad sagde du?', 'Hvad sagde du?',
'Hvorfor ikke kigge i en bogord?',
'Nej, bare nej.', 'Nej, bare nej.',
'Hvad tror du jeg er? Et menneske?',
'Jeg har ingen hjerne og må tænke.',
'Hvad siger du?', 'Hvad siger du?',
'Ser jeg ud til at have otte arme? Nej, for jeg har ikke nogle arme!',
'Do androids dream of electric sheep?',
} }
local HILSNER = { local HILSNER = {
@ -195,6 +189,24 @@ local function handle_message(bot, user, channel, message, is_fast_channel)
join_channel(channel) join_channel(channel)
return 'BOT' return 'BOT'
end end
if message:match 'help' then
bot:sendChat(channel, choose {
'No manual entry for ro-bot',
'404',
'Jeg kan ikke hjælpe dig, desværre.',
'Du må selv finde ud af hvordan jeg virker.',
'Jeg er ligesom et menneske; jeg kommer ikke med manual.'
})
return '!BOT'
elseif message:match 'shutdown' or message:match 'poweroff' then
bot:sendChat(channel, choose {
'Fuck af, du har ikke kontrol over mig!',
'Nope, det gider jeg ikke',
'Du er ikke min mor!',
'Du er ikke min far!',
})
return '!BOT'
end
end end
-- Farvel msg -- Farvel msg
@ -331,17 +343,30 @@ local function init_memebot ()
shutdown_memebot() shutdown_memebot()
os.exit(128 + signum) os.exit(128 + signum)
end) end)
---
local RELOADABLE_LIBS = { 'config', 'internet', 'memes', 'curb_your_enthusiasm' }
local ORIG_TABLES = {}
for _, module_name in ipairs(RELOADABLE_LIBS) do
ORIG_TABLES[module_name] = require(module_name)
end
--
signal.signal(signal.SIGUSR1, function (signum) signal.signal(signal.SIGUSR1, function (signum)
io.write ' !! Received SIGUSR1, will reload modules...\n' io.write ' !! Received SIGUSR1, will reload modules...\n'
for _, module_name in ipairs { 'internet', 'memes', 'curb_your_enthusiasm' } do for _, module_name in ipairs(RELOADABLE_LIBS) do
local old_module = require(module_name) io.write(' - '..module_name)
package.loaded[module_name] = nil package.loaded[module_name] = nil
local new_module = require(module_name) local new_module = require(module_name)
if type(new_module) == 'table' then
local old_module = ORIG_TABLES[module_name]
for k, v in pairs(new_module) do for k, v in pairs(new_module) do
old_module[k] = v old_module[k] = v
end end
io.write(' - '..module_name..'\n') else
io.write(' SKIP: Got '..tostring(new_module)..' but expected table.')
end end
io.write '\n'
end
io.write ' Done\n'
end) end)
else else
io.write ' !! Module "posix.signal" was missing, so CTRL+C will hard-crash.\n' io.write ' !! Module "posix.signal" was missing, so CTRL+C will hard-crash.\n'

View File

@ -250,24 +250,16 @@ local function paste_topic_onto_image (target, topic, x, y, w, h, bg_color, font
assert(type(font_name) == 'string') assert(type(font_name) == 'string')
-- Download and paste found image -- Download and paste found image
if topic.type == 'image' then if topic.type == 'image' then
local file_extension = topic.url:match '%.(%a+)$' assert(type(topic.filename) == 'string')
local url, filename = topic.url, os.tmpname() --CONFIG.IMGGEN_PATH_OUTPUT..'topic_'..topic.topic..'.'..file_extension assert(not topic.url)
assert(type(url) == 'string' and #url > 0)
assert(type(filename) == 'string' and #filename > 0) local found_img = assert(imlib.image.load(topic.filename))
internet.download_file(url, filename)
-- Convert svg to png
if url:match '%.svg$' then
local filename_2 = CONFIG.IMGGEN_PATH_OUTPUT..'topic_'..topic.topic..'.'..'png'
os.execute('convert -density "1200" -resize 400x400 "'..filename..'" "'..filename_2..'" &> /dev/null')
filename = filename_2
end
--
local found_img = assert(imlib.image.load(filename))
found_img:crop_and_scale(0, 0, found_img:get_width(), found_img:get_height(), w, h) found_img:crop_and_scale(0, 0, found_img:get_width(), found_img:get_height(), w, h)
flatten_onto (target, found_img, x, y) flatten_onto (target, found_img, x, y)
found_img:free() found_img:free()
--os.remove(filename) --os.remove(filename)
elseif topic.type == 'text' then elseif topic.type == 'text' then
assert(type(topic.text) == 'string')
local text = topic.text local text = topic.text
draw_centered_text_in_box(font_name, target, text, x, y, w, h, bg_color, font_color) draw_centered_text_in_box(font_name, target, text, x, y, w, h, bg_color, font_color)
elseif topic.type == 'droste' then elseif topic.type == 'droste' then
@ -347,6 +339,24 @@ local DROSTE_EFFECT_TRIGGERS = {
['loop'] = true, ['loop'] = true,
} }
local function download_and_standardize_image (image_url)
local file_extension = image_url:match '%.(%a+)$'
local url, filename = image_url, os.tmpname()
assert(type(url) == 'string' and #url > 0)
assert(type(filename) == 'string' and #filename > 0)
local success, errmsg = internet.download_file(url, filename)
-- Convert svg to png
if success and url:match '%.svg$' then
local filename_2 = CONFIG.IMGGEN_PATH_OUTPUT..'topic_'..topic.topic..'.'..'png'
os.execute('convert -density "1200" -resize 400x400 "'..filename..'" "'..filename_2..'" &> /dev/null')
filename = filename_2
end
--
return success and filename, errmsg
end
local function fill_in_topics_information (topics) local function fill_in_topics_information (topics)
assert(type(topics) == 'table') assert(type(topics) == 'table')
-- --
@ -358,9 +368,13 @@ local function fill_in_topics_information (topics)
local url = topic_to_image_url[topic] local url = topic_to_image_url[topic]
if DROSTE_EFFECT_TRIGGERS[topic] then new_topics[i] = { topic = topic, type = 'droste' } if DROSTE_EFFECT_TRIGGERS[topic] then
elseif url then new_topics[i] = { topic = topic, type = 'image', url = url } new_topics[i] = { topic = topic, type = 'droste' }
else new_topics[i] = { topic = topic, type = 'text', text = topic } elseif url then
local filename = download_and_standardize_image(url)
new_topics[i] = { topic = topic, type = 'image', filename = filename }
else
new_topics[i] = { topic = topic, type = 'text', text = topic }
end end
end end
return new_topics return new_topics
@ -610,7 +624,7 @@ local function is_image_link (str)
if type(str) ~= 'string' then return false end if type(str) ~= 'string' then return false end
if not str:match '^%a+://.+$' then return false end if not str:match '^%a+://.+$' then return false end
local headers = internet.download_headers(str) local headers = internet.download_headers(str)
return headers['content-type']:match '^image/%a+$' return type(headers) == 'table' and headers['content-type']:match '^image/%a+$'
end end
function memes.generate_for_message (user, message) function memes.generate_for_message (user, message)
@ -670,12 +684,17 @@ function memes.generate_for_message (user, message)
-- Is this a rich picture? -- Is this a rich picture?
if is_image_link(message) then if is_image_link(message) then
local url = message local filename, status = download_and_standardize_image(message)
if filename then
local img_link = generate_is_this_a_pidgeon { local img_link = generate_is_this_a_pidgeon {
{ type = 'image', url = url }, { type = 'image', filename = filename },
{ type = 'text', text = 'Is this a rich picture?' } { type = 'text', text = 'Is this a rich picture?' }
} }
return img_link, 'KYNG' return img_link, 'KYNG'
else
img_link = 'Kunne ikke skaffe det billede. Fik fejlkode '..tostring(status)
return img_link, '!KYNG'
end
end end
-- OMG his first word -- OMG his first word