mod_muc_dicebot/mod_muc_dicebot.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 24 Sep 2022 09:26:26 +0100
changeset 5063 5f1120c284c5
parent 4584 785389a2d2b3
permissions -rw-r--r--
mod_cloud_notify_extensions: Add note about dependency Noting here because people might not click through to see it on the mod_cloud_notify_encrypted page.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4583
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");
4584
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4583
diff changeset
    40
	if not body then
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4583
diff changeset
    41
		return
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4583
diff changeset
    42
	end
785389a2d2b3 mod_muc_dicebot: ignore messages without body
Jonas Schäfer <jonas@wielicki.name>
parents: 4583
diff changeset
    43
4583
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);