Annotate

mod_muc_dicebot/mod_muc_dicebot.lua @ 5551:8bfcedd93a72

mod_rest: List all error conditions in OpenAPI spec These are not handled by datamanager but by util.stanza and util.error, so they are not represented in the JSON schema file.
author Kim Alvefur <zash@zash.se>
date Sat, 17 Jun 2023 16:26:33 +0200
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);