Mercurial > prosody-hg
annotate plugins/muc/vcard.lib.lua @ 13920:2169be3581ae 13.0
migrator: Allow migrating between different configs of the same driver
This was notably a problem with SQL since mod_storage_sql is a single
module that connects to different SQL databases. The problem was that
since it was already loaded once, the output configuration was not
applied and it would have migrated to the origin database.
This essentially reloads the module after updating the configuration,
which should work with all storage modules as long as everything they
need are kept in the 'provider' or driver table.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 03 Aug 2025 15:14:20 +0200 |
| parents | 31f8fd2bcab9 |
| children | f4e16e6265e6 |
| 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); |
