changeset 4252:1327e1e1c94e

mod_ogp: Add module
author Seve Ferrer <seve@delape.net>
date Sun, 15 Nov 2020 19:07:34 +0100
parents d33b480befcb
children 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)