mod_muc_dicebot/mod_muc_dicebot.lua
author Matthew Wild <mwild1@gmail.com>
Tue, 18 Jan 2022 17:01:18 +0000
changeset 4880 0f5f2d4475b9
parent 4584 785389a2d2b3
permissions -rw-r--r--
mod_http_xep227: Add support for import via APIs rather than direct store manipulation In particular this transitions PEP nodes and data to be imported via mod_pep's APIs, fixing issues with importing at runtime while PEP data may already be live in RAM. Next obvious candidate for this approach is rosters, so clients get immediate roster pushes and other special handling (such as emitting subscribes to reach the desired subscription state).
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);