annotate plugins/muc/vcard.lib.lua @ 13941:f4e16e6265e6 13.0

mod_muc: Remove avatar hash caching Computing the hash of the room might be a bit expensive, but this cache was preventing any change from reaching clients, so let’s disable it. Fixes #1961.
author Link Mauve <linkmauve@linkmauve.fr>
date Mon, 08 Sep 2025 12:19:26 +0200
parents 31f8fd2bcab9
children 758dd39c2808
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 local room_node = jid.split(room.jid);
13941
f4e16e6265e6 mod_muc: Remove avatar hash caching
Link Mauve <linkmauve@linkmauve.fr>
parents: 13660
diff changeset
14 return mod_vcard.get_avatar_hash(room_node);
13657
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 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
18 local hash = get_avatar_hash(room);
13660
31f8fd2bcab9 MUC: Don't inform people about the avatar hash when there is none
Matthew Wild <mwild1@gmail.com>
parents: 13657
diff changeset
19 if not hash and to then return; end -- Don't announce when no avatar
13657
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 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
22 :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
23 :tag("photo"):text(hash):up();
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 if to == nil then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 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
27 room:broadcast_message(presence_vcard);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 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
30 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
31 :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
32 :tag("status", { code = "104" }));
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 else
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 module:send(presence_vcard);
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 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 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
41 local stanza = event.stanza;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local to = stanza.attr.to;
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 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
45 return;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 end
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 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
49 if not room then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 return;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 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
54 if sender_affiliation == "owner" then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 event.allow_vcard_modification = true;
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 end, 10);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 if advertise_hashes ~= "none" then
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 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
61 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
62 end);
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 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
64 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
65 send_avatar_hash(room, nil);
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 end
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 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
70 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
71
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 table.insert(event.form, {
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 name = "muc#roominfo_avatarhash",
404d3644ac4a mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 type = "text-multi",
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 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
77 end);