Annotate

plugins/muc/vcard.lib.lua @ 13657:404d3644ac4a

mod_muc: Integrate support for vcards/avatars on MUC rooms This was previously served by a community module (mod_vcard_muc). It can be disabled by setting `vcard_muc = false` in the config.
author Matthew Wild <mwild1@gmail.com>
date Thu, 06 Feb 2025 17:08:46 +0000
child 13660:31f8fd2bcab9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13657
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local mod_vcard = module:depends("vcard");
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local jid = require "prosody.util.jid";
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local st = require "prosody.util.stanza";
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- This must be the same event that mod_vcard hooks
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local vcard_event = "iq/bare/vcard-temp:vCard";
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local advertise_hashes = module:get_option("muc_avatar_advertise_hashes");
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 --luacheck: ignore 113/get_room_from_jid
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local function get_avatar_hash(room)
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 if room.avatar_hash then return room.avatar_hash; end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local room_node = jid.split(room.jid);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local hash = mod_vcard.get_avatar_hash(room_node);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 room.avatar_hash = hash;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 return hash;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local function send_avatar_hash(room, to)
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 local hash = get_avatar_hash(room);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local presence_vcard = st.presence({to = to, from = room.jid})
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 :tag("x", { xmlns = "vcard-temp:x:update" })
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 :tag("photo"):text(hash):up();
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 if to == nil then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 if not advertise_hashes or advertise_hashes == "presence" then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 room:broadcast_message(presence_vcard);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 if not advertise_hashes or advertise_hashes == "message" then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 room:broadcast_message(st.message({ from = room.jid, type = "groupchat" })
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 :tag("x", { xmlns = "http://jabber.org/protocol/muc#user" })
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 :tag("status", { code = "104" }));
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 else
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 module:send(presence_vcard);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 module:hook(vcard_event, function (event)
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 local stanza = event.stanza;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 local to = stanza.attr.to;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 if stanza.attr.type ~= "set" then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 return;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 local room = get_room_from_jid(to);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 if not room then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 return;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 local sender_affiliation = room:get_affiliation(stanza.attr.from);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 if sender_affiliation == "owner" then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 event.allow_vcard_modification = true;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 end, 10);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 if advertise_hashes ~= "none" then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 module:hook("muc-occupant-joined", function (event)
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 send_avatar_hash(event.room, event.stanza.attr.from);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 module:hook("vcard-updated", function (event)
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 local room = get_room_from_jid(event.stanza.attr.to);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 send_avatar_hash(room, nil);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 end);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 module:hook("muc-disco#info", function (event)
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 event.reply:tag("feature", { var = "vcard-temp" }):up();
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 table.insert(event.form, {
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 name = "muc#roominfo_avatarhash",
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 type = "text-multi",
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 });
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 event.formdata["muc#roominfo_avatarhash"] = get_avatar_hash(event.room);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 end);