Mercurial > prosody-modules
comparison mod_muc_limits/mod_muc_limits.lua @ 5601:6680a1f53353
mod_muc_limits: Reduce cost of multi-line messages, make configurable
Typing a 5-line message preceded by a few chat states would have hit the
default limit.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 15 Jul 2023 09:09:41 +0200 |
parents | d52cc18f0aa8 |
children |
comparison
equal
deleted
inserted
replaced
5600:c799b460f9f0 | 5601:6680a1f53353 |
---|---|
13 local burst = math.max(module:get_option_number("muc_burst_factor", 6), 1); | 13 local burst = math.max(module:get_option_number("muc_burst_factor", 6), 1); |
14 | 14 |
15 local max_nick_length = module:get_option_number("muc_max_nick_length", 23); -- Default chosen through scientific methods | 15 local max_nick_length = module:get_option_number("muc_max_nick_length", 23); -- Default chosen through scientific methods |
16 local max_line_count = module:get_option_number("muc_max_line_count", 23); -- Default chosen through s/scientific methods/copy and paste/ | 16 local max_line_count = module:get_option_number("muc_max_line_count", 23); -- Default chosen through s/scientific methods/copy and paste/ |
17 local max_char_count = module:get_option_number("muc_max_char_count", 5664); -- Default chosen by multiplying a number by 23 | 17 local max_char_count = module:get_option_number("muc_max_char_count", 5664); -- Default chosen by multiplying a number by 23 |
18 local base_cost = math.max(module:get_option_number("muc_limit_base_cost", 1), 0); | |
19 local line_multiplier = math.max(module:get_option_number("muc_line_count_multiplier", 0.1), 0); | |
18 | 20 |
19 local join_only = module:get_option_boolean("muc_limit_joins_only", false); | 21 local join_only = module:get_option_boolean("muc_limit_joins_only", false); |
20 local dropped_count = 0; | 22 local dropped_count = 0; |
21 local dropped_jids; | 23 local dropped_jids; |
22 | 24 |
47 local throttle = room.throttle; | 49 local throttle = room.throttle; |
48 if not room.throttle then | 50 if not room.throttle then |
49 throttle = new_throttle(period*burst, burst); | 51 throttle = new_throttle(period*burst, burst); |
50 room.throttle = throttle; | 52 room.throttle = throttle; |
51 end | 53 end |
52 local cost = 1; | 54 local cost = base_cost; |
53 local body = stanza:get_child_text("body"); | 55 local body = stanza:get_child_text("body"); |
54 if body then | 56 if body then |
55 -- TODO calculate a text diagonal cross-section or some mathemagical | 57 -- TODO calculate a text diagonal cross-section or some mathemagical |
56 -- number, maybe some cost multipliers | 58 -- number, maybe some cost multipliers |
57 if #body > max_char_count then | 59 if #body > max_char_count then |
63 if body_lines > max_line_count then | 65 if body_lines > max_line_count then |
64 origin.send(st.error_reply(stanza, "modify", "policy-violation", "Your message is too long, please write a shorter one"):up() | 66 origin.send(st.error_reply(stanza, "modify", "policy-violation", "Your message is too long, please write a shorter one"):up() |
65 :tag("x", { xmlns = xmlns_muc; })); | 67 :tag("x", { xmlns = xmlns_muc; })); |
66 return true; | 68 return true; |
67 end | 69 end |
68 cost = cost + body_lines; | 70 cost = cost + (body_lines * line_multiplier); |
69 end | 71 end |
70 if not throttle:poll(cost) then | 72 if not throttle:poll(cost) then |
71 module:log("debug", "Dropping stanza for %s@%s from %s, over rate limit", dest_room, dest_host, from_jid); | 73 module:log("debug", "Dropping stanza for %s@%s from %s, over rate limit", dest_room, dest_host, from_jid); |
72 if not dropped_jids then | 74 if not dropped_jids then |
73 dropped_jids = { [from_jid] = true, from_jid }; | 75 dropped_jids = { [from_jid] = true, from_jid }; |