Software /
code /
prosody
Annotate
plugins/muc/vcard.lib.lua @ 13660:31f8fd2bcab9
MUC: Don't inform people about the avatar hash when there is none
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 07 Feb 2025 10:19:36 +0000 |
parent | 13657:404d3644ac4a |
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); |
13660
31f8fd2bcab9
MUC: Don't inform people about the avatar hash when there is none
Matthew Wild <mwild1@gmail.com>
parents:
13657
diff
changeset
|
24 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
|
25 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 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
|
27 :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
|
28 :tag("photo"):text(hash):up(); |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 if to == nil then |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 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
|
32 room:broadcast_message(presence_vcard); |
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 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
|
35 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
|
36 :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
|
37 :tag("status", { code = "104" })); |
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 else |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 module:send(presence_vcard); |
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 end |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 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
|
46 local stanza = event.stanza; |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 local to = stanza.attr.to; |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 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
|
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 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
|
54 if not room then |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 return; |
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 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 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
|
59 if sender_affiliation == "owner" then |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 event.allow_vcard_modification = true; |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 end |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 end, 10); |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 if advertise_hashes ~= "none" then |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 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
|
66 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
|
67 end); |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 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
|
69 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
|
70 send_avatar_hash(room, nil); |
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 end |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 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
|
75 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
|
76 |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 table.insert(event.form, { |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 name = "muc#roominfo_avatarhash", |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 type = "text-multi", |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 }); |
404d3644ac4a
mod_muc: Integrate support for vcards/avatars on MUC rooms
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 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
|
82 end); |