local mod_muc = module:depends("muc")
local http = require "net.http"
local st = require "util.stanza"
local ogp_pattern = [[]]
local ogp_pattern2 = [[]]
local url_pattern = [[https?://%S+]]
local function ogp_handler(event)
local room, stanza = event.room, st.clone(event.stanza)
local body = stanza:get_child_text("body")
if not body then return; end
local url = body:match(url_pattern)
if not url then return; end
local origin_id = stanza:find("{urn:xmpp:sid:0}origin-id@id")
if not origin_id then return; end
http.request(
url,
nil,
function(response_body, response_code, _)
if response_code ~= 200 then
return
end
local to = room.jid
local from = room and room.jid or module.host
local fastening = st.message({to = to, from = from}):tag("apply-to", {xmlns = "urn:xmpp:fasten:0", id = origin_id})
local found_metadata = false
local message_body = ""
local meta_pattern = [[]]
for match in response_body:gmatch(meta_pattern) do
local property = match:match([[property=%s*["']?(og:.-)["']?%s]])
if not property then
property = match:match([[property=["']?(og:.-)["']$]])
end
local content = match:match([[content=%s*["'](.-)["']%s]])
if not content then
content = match:match([[content=["']?(.-)["']$]])
end
if not content then
content = match:match([[content=(.-) property]])
end
if not content then
content = match:match([[content=(.-)$]])
end
if property and content then
module:log("info", property .. "\t" .. content)
fastening:tag(
"meta",
{
xmlns = "http://www.w3.org/1999/xhtml",
property = property,
content = content
}
):up()
found_metadata = true
message_body = message_body .. property .. "\t" .. content .. "\n"
end
end
if found_metadata then
mod_muc.get_room_from_jid(room.jid):broadcast_message(fastening)
end
module:log("info", tostring(fastening))
end
)
end
module:hook("muc-occupant-groupchat", ogp_handler)