comparison mod_muc_inject_mentions/mod_muc_inject_mentions.lua @ 4164:a82b0745383b

mod_muc_inject_mentions: Add new configuration setting to choose between registered nicknames or online participants
author Seve Ferrer <seve@delape.net>
date Thu, 01 Oct 2020 16:20:09 +0200
parents 320f6d374b5d
children aed7038ab2ab
comparison
equal deleted inserted replaced
4163:320f6d374b5d 4164:a82b0745383b
8 local enabled_rooms = module:get_option("muc_inject_mentions_enabled_rooms", nil) 8 local enabled_rooms = module:get_option("muc_inject_mentions_enabled_rooms", nil)
9 local disabled_rooms = module:get_option("muc_inject_mentions_disabled_rooms", nil) 9 local disabled_rooms = module:get_option("muc_inject_mentions_disabled_rooms", nil)
10 local mention_delimiters = module:get_option_set("muc_inject_mentions_mention_delimiters", {" ", "", "\n"}) 10 local mention_delimiters = module:get_option_set("muc_inject_mentions_mention_delimiters", {" ", "", "\n"})
11 local append_mentions = module:get_option("muc_inject_mentions_append_mentions", false) 11 local append_mentions = module:get_option("muc_inject_mentions_append_mentions", false)
12 local strip_out_prefixes = module:get_option("muc_inject_mentions_strip_out_prefixes", false) 12 local strip_out_prefixes = module:get_option("muc_inject_mentions_strip_out_prefixes", false)
13 local reserved_nicks = module:get_option("muc_inject_mentions_reserved_nicks", false)
13 14
14 15
15 local reference_xmlns = "urn:xmpp:reference:0" 16 local reference_xmlns = "urn:xmpp:reference:0"
17
18 local function get_participants(room)
19 if not reserved_nicks then
20 local occupants = room._occupants
21 local key, occupant = next(occupants)
22 return function ()
23 while occupant do -- luacheck: ignore
24 local nick = jid_resource(occupant.nick);
25 local bare_jid = occupant.bare_jid
26 key, occupant = next(occupants, key)
27 return bare_jid, nick
28 end
29 end
30 else
31 local generator = room:each_affiliation()
32 local jid, _, affiliation_data = generator(nil, nil)
33 return function ()
34 while jid do
35 local bare_jid, nick = jid, (affiliation_data or {})["reserved_nickname"]
36 jid, _, affiliation_data = generator(nil, bare_jid)
37 if nick then
38 return bare_jid, nick
39 end
40 end
41 end
42 end
43 end
16 44
17 local function add_mention(mentions, bare_jid, first, last, prefix_indices, has_prefix) 45 local function add_mention(mentions, bare_jid, first, last, prefix_indices, has_prefix)
18 if strip_out_prefixes then 46 if strip_out_prefixes then
19 if has_prefix then 47 if has_prefix then
20 table.insert(prefix_indices, first-1) 48 table.insert(prefix_indices, first-1)
109 end 137 end
110 138
111 local function search_mentions(room, body, client_mentions) 139 local function search_mentions(room, body, client_mentions)
112 local mentions, prefix_indices = {}, {} 140 local mentions, prefix_indices = {}, {}
113 141
114 for _, occupant in pairs(room._occupants) do 142 for bare_jid, nick in get_participants(room) do
115 local nick = jid_resource(occupant.nick);
116 -- Check for multiple mentions to the same nickname in a message 143 -- Check for multiple mentions to the same nickname in a message
117 -- Hey @nick remember to... Ah, also @nick please let me know if... 144 -- Hey @nick remember to... Ah, also @nick please let me know if...
118 local matches = {} 145 local matches = {}
119 local _first 146 local _first
120 local _last = 0 147 local _last = 0
126 table.insert(matches, {first=_first, last=_last}) 153 table.insert(matches, {first=_first, last=_last})
127 end 154 end
128 155
129 -- Filter out intentional mentions from unintentional ones 156 -- Filter out intentional mentions from unintentional ones
130 for _, match in ipairs(matches) do 157 for _, match in ipairs(matches) do
131 local bare_jid = occupant.bare_jid
132 local first, last = match.first, match.last 158 local first, last = match.first, match.last
133 -- Only append new mentions in case the client already sent some 159 -- Only append new mentions in case the client already sent some
134 if not client_mentions[first] then 160 if not client_mentions[first] then
135 -- Body only contains nickname or is between spaces, new lines or at the end/start of the body 161 -- Body only contains nickname or is between spaces, new lines or at the end/start of the body
136 if mention_delimiters:contains(body:sub(first - 1, first - 1)) and 162 if mention_delimiters:contains(body:sub(first - 1, first - 1)) and