Comparison

mod_ogp/mod_ogp.lua @ 4459:dbfda7f5522d

mod_ogp: Make sure OGP fasten messages get archived - By adding a type of "groupchat" - By adding a hook for `muc-message-is-historic`
author JC Brand <jc@opkode.com>
date Mon, 22 Feb 2021 17:37:50 +0100
parent 4255:38da10e4b593
child 4482:21698b960bd6
comparison
equal deleted inserted replaced
4458:5234d0c8883d 4459:dbfda7f5522d
1 local mod_muc = module:depends("muc") 1 local mod_muc = module:depends("muc")
2 local http = require "net.http" 2 local http = require "net.http"
3 local st = require "util.stanza" 3 local st = require "util.stanza"
4
5 local ogp_pattern = [[<meta property=["']?(og:.-)["']? content=%s*["']?(.-)["']?%s-/?>]]
6 local ogp_pattern2 = [[<meta content=%s*["']?(.-)["']? property=["']?(og:.-)["']?%s-/?>]]
7 local url_pattern = [[https?://%S+]] 4 local url_pattern = [[https?://%S+]]
5 local xmlns_fasten = "urn:xmpp:fasten:0";
6 local xmlns_xhtml = "http://www.w3.org/1999/xhtml";
8 7
9 local function ogp_handler(event) 8 local function ogp_handler(event)
10 local room, stanza = event.room, st.clone(event.stanza) 9 local room, stanza = event.room, st.clone(event.stanza)
11 local body = stanza:get_child_text("body") 10 local body = stanza:get_child_text("body")
12 if not body then return; end 11 if not body then return; end
25 return 24 return
26 end 25 end
27 26
28 local to = room.jid 27 local to = room.jid
29 local from = room and room.jid or module.host 28 local from = room and room.jid or module.host
30 local fastening = st.message({to = to, from = from}):tag("apply-to", {xmlns = "urn:xmpp:fasten:0", id = origin_id}) 29 local fastening = st.message({to = to, from = from, type = 'groupchat'}):tag("apply-to", {xmlns = xmlns_fasten, id = origin_id})
31 local found_metadata = false 30 local found_metadata = false
32 local message_body = "" 31 local message_body = ""
33 32
34 local meta_pattern = [[<meta (.-)/?>]] 33 local meta_pattern = [[<meta (.-)/?>]]
35 for match in response_body:gmatch(meta_pattern) do 34 for match in response_body:gmatch(meta_pattern) do
52 if property and content then 51 if property and content then
53 module:log("info", property .. "\t" .. content) 52 module:log("info", property .. "\t" .. content)
54 fastening:tag( 53 fastening:tag(
55 "meta", 54 "meta",
56 { 55 {
57 xmlns = "http://www.w3.org/1999/xhtml", 56 xmlns = xmlns_xhtml,
58 property = property, 57 property = property,
59 content = content 58 content = content
60 } 59 }
61 ):up() 60 ):up()
62 found_metadata = true 61 found_metadata = true
63 message_body = message_body .. property .. "\t" .. content .. "\n" 62 message_body = message_body .. property .. "\t" .. content .. "\n"
64 end 63 end
65 end 64 end
66
67 65
68 if found_metadata then 66 if found_metadata then
69 mod_muc.get_room_from_jid(room.jid):broadcast_message(fastening) 67 mod_muc.get_room_from_jid(room.jid):broadcast_message(fastening)
70 end 68 end
71 module:log("info", tostring(fastening)) 69 module:log("info", tostring(fastening))
72 end 70 end
73 ) 71 )
74 end 72 end
75 73
76 module:hook("muc-occupant-groupchat", ogp_handler) 74 module:hook("muc-occupant-groupchat", ogp_handler)
75
76
77 module:hook("muc-message-is-historic", function (event)
78 local fastening = event.stanza:get_child('apply-to', xmlns_fasten)
79 if fastening and fastening:get_child('meta', xmlns_xhtml) then
80 return true
81 end
82 end);