Software /
code /
prosody-modules
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 |
parent | 4163:320f6d374b5d |
child | 4243: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 |