mod_muc_intercom/mod_muc_intercom.lua
author Kim Alvefur <zash@zash.se>
Sat, 29 Apr 2023 13:09:46 +0200
changeset 5387 df11a2cbc7b7
parent 3074 c271bfa3d625
permissions -rw-r--r--
mod_http_oauth2: Implement RFC 7628 Proof Key for Code Exchange Likely to become mandatory in OAuth 2.1. Backwards compatible since the default 'plain' verifier would compare nil with nil if the relevant parameters are left out.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- Relay messages between rooms
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
-- By Kim Alvefur <zash@zash.se>
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local host_session = prosody.hosts[module.host];
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
local st_msg = require "util.stanza".message;
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local jid = require "util.jid";
285
108ac6f16d2d mod_muc_intercom: Add a delay to the forwarded message.
Kim Alvefur <zash@zash.se>
parents: 280
diff changeset
     7
local now = require "util.datetime".datetime;
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
3074
c271bfa3d625 mod_muc_intercom: Fix to use correct name for variable
Kim Alvefur <zash@zash.se>
parents: 2813
diff changeset
     9
local function get_room_from_jid(mod_muc, jid)
c271bfa3d625 mod_muc_intercom: Fix to use correct name for variable
Kim Alvefur <zash@zash.se>
parents: 2813
diff changeset
    10
	if mod_muc.get_room_from_jid then
c271bfa3d625 mod_muc_intercom: Fix to use correct name for variable
Kim Alvefur <zash@zash.se>
parents: 2813
diff changeset
    11
		return mod_muc.get_room_from_jid(jid);
1425
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    12
	elseif mod_muc.rooms then
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    13
		return mod_muc.rooms[jid]; -- COMPAT 0.9, 0.10
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    14
	end
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    15
end
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    16
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
function check_message(data)
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
	local origin, stanza = data.origin, data.stanza;
1425
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    19
	local mod_muc = host_session.muc;
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    20
	if not mod_muc then return; end
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
3074
c271bfa3d625 mod_muc_intercom: Fix to use correct name for variable
Kim Alvefur <zash@zash.se>
parents: 2813
diff changeset
    22
	local this_room = get_room_from_jid(mod_muc, stanza.attr.to);
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
	if not this_room then return; end -- no such room
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	local from_room_jid = this_room._jid_nick[stanza.attr.from];
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
	if not from_room_jid then return; end -- no such nick
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
	local from_room, from_host, from_nick = jid.split(from_room_jid);
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	local body = stanza:get_child("body");
253
7410d1005fea mod_muc_intercom: Fix traceback on topic changes
Kim Alvefur <zash@zash.se>
parents: 247
diff changeset
    31
	if not body then return; end -- No body, like topic changes
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
	body = body and body:get_text(); -- I feel like I want to do `or ""` there :/
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	local target_room, message = body:match("^@([^:]+):(.*)");
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
	if not target_room or not message then return; end
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
	if target_room == from_room then return; end -- don't route to itself
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
	module:log("debug", "target room is %s", target_room);
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
	local bare_room = jid.join(target_room, from_host);
3074
c271bfa3d625 mod_muc_intercom: Fix to use correct name for variable
Kim Alvefur <zash@zash.se>
parents: 2813
diff changeset
    40
	local dest_room = get_room_from_jid(mod_muc, bare_room);
1425
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    41
	if not dest_room then return; end -- TODO send a error
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
	module:log("info", "message from %s in %s to %s", from_nick, from_room, target_room);
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
	local sender = jid.join(target_room, module.host, from_room .. "/" .. from_nick);
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
	local forward_stanza = st_msg({from = sender, to = bare_room, type = "groupchat"}, message);
285
108ac6f16d2d mod_muc_intercom: Add a delay to the forwarded message.
Kim Alvefur <zash@zash.se>
parents: 280
diff changeset
    46
	forward_stanza:tag("delay", { xmlns = 'urn:xmpp:delay', from = from_room_jid, stamp = now() }):up();
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
	module:log("debug", "broadcasting message to target room");
1425
9c894b56b4e4 mod_muc_intercom: Make compatible with new MUC API.
Waqas Hussain <waqas20@gmail.com>
parents: 285
diff changeset
    49
	dest_room:broadcast_message(forward_stanza);
247
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
end
fbddb9db1c82 adds mod_muc_intercom; forwards messages between rooms on a muc host
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
2813
6d3935226ffb Backed out changeset 6d72c5172c74
Kim Alvefur <zash@zash.se>
parents: 1425
diff changeset
    52
module:hook("message/bare", check_message);