Annotate

mod_muc_dicebot/mod_muc_dicebot.lua @ 5908:49b0873932ca

mod_pubsub_serverinfo: Don't default to non-local pubsub servers (thanks roughnecks)
author Matthew Wild <mwild1@gmail.com>
date Tue, 16 Apr 2024 12:41:52 +0100
parent 4580:785389a2d2b3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4579
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
1 local muc = module:depends("muc");
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
2 local rand = require"util.random";
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
3
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
4 local s_match = string.match;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
5 local s_gmatch = string.gmatch;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
6 local t_insert = table.insert;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
7 local t_concat = table.concat;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
8
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
9 local rooms = module:get_option_set("muc_dicebot_rooms", nil);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
10 local xmlns_nick = "http://jabber.org/protocol/nick";
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
11
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
12 local function is_room_affected(roomjid)
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
13 return not rooms or rooms:contains(roomjid)
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
14 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
15
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
16 local function roll(sides)
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
17 if sides > 256 then
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
18 return nil, "too many sides"
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
19 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
20 local factor = math.floor(256 / sides);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
21 local cutoff = sides * factor;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
22 module:log("error", "%d -> %d %d %d", sides, max, factor, cutoff);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
23 for i=1,10 do
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
24 local randomness = string.byte(rand.bytes(1), 1);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
25 module:log("error", "%d", randomness);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
26 if randomness < cutoff then
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
27 return (randomness % sides) + 1
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
28 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
29 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
30 return nil, "failed to find valid number"
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
31 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
32
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
33 local function muc_broadcast_message(event)
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
34 if not is_room_affected(event.room.jid) then
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
35 return
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
36 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
37
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
38 local stanza = event.stanza;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
39 local body = stanza:get_child("body");
4580
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4579
diff changeset
40 if not body then
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4579
diff changeset
41 return
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4579
diff changeset
42 end
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4579
diff changeset
43
4579
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
44 local text = body:get_text();
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
45 module:log("error", "%q %q %q", stanza, body, text);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
46 local dice = s_match(text, "^[%.!]r%s(.+)$");
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
47 if not dice or dice == "" then
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
48 return
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
49 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
50
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
51 local results = {};
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
52 local count = 0;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
53 local sum = 0;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
54 for ndice, sep, sides in s_gmatch(dice, "(%d*)([wd]?)(%d+)") do
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
55 if not sep or sep == "" then
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
56 sides = ndice .. sides
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
57 ndice = "1"
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
58 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
59 local ndice = tonumber(ndice);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
60 count = count + ndice;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
61 if count > 100 then
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
62 return true
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
63 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
64 local sides = tonumber(sides);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
65 for i=1,ndice do
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
66 local value = roll(sides);
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
67 t_insert(results, tostring(value));
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
68 sum = sum + value;
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
69 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
70 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
71 body:text("\n⇒ "..t_concat(results, " ").." (sum: "..sum..")");
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
72 end
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
73
b305814bd930 mod_muc_dicebot: A thing to roll dice
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
74 module:hook("muc-broadcast-message", muc_broadcast_message);