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 };