Software /
code /
prosody
Annotate
plugins/muc/vcard.lib.lua @ 13745:994ea8d54b72 13.0
core.configmanager: Pass name and line number in context
Delays the string interpolation until the warning is logged, which may
slightly lower memory usage.
Allows retrieving the filename and line number easily.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 22 Feb 2025 00:04:51 +0100 |
parent | 13660:31f8fd2bcab9 |
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); |