Software /
code /
prosody-modules
Changeset
4252:1327e1e1c94e
mod_ogp: Add module
author | Seve Ferrer <seve@delape.net> |
---|---|
date | Sun, 15 Nov 2020 19:07:34 +0100 |
parents | 4251:d33b480befcb |
children | 4253:32b4901a9d8d |
files | mod_ogp/README.md mod_ogp/mod_ogp.lua |
diffstat | 2 files changed, 69 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_ogp/README.md Sun Nov 15 19:07:34 2020 +0100 @@ -0,0 +1,1 @@ +In development. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_ogp/mod_ogp.lua Sun Nov 15 19:07:34 2020 +0100 @@ -0,0 +1,68 @@ +local mod_muc = module:depends("muc") +local http = require "net.http" +local st = require "util.stanza" + +local ogp_pattern = [[<meta property=["'](og:.-)["'] content=["'](.-)["'].->]] +local ogp_pattern2 = [[<meta content=["'](.-)["'] property=["'](og:.-)["'].->]] +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 = "" + for property, content in response_body:gmatch(ogp_pattern) do + 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 + for content, property in response_body:gmatch(ogp_pattern2) do + 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 + + 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)