Mercurial > prosody-modules
comparison mod_groups_internal/mod_groups_internal.lua @ 4388:7de3c955cfe2
mod_groups_internal: allow creating MUCs if a MUC host is linked
| author | Jonas Schäfer <jonas@wielicki.name> |
|---|---|
| date | Mon, 25 Jan 2021 21:47:38 +0100 |
| parents | 6357ac65b4eb |
| children | 6cfa313cd524 |
comparison
equal
deleted
inserted
replaced
| 4387:e5b4ebacbf7a | 4388:7de3c955cfe2 |
|---|---|
| 1 local rostermanager = require"core.rostermanager"; | 1 local rostermanager = require"core.rostermanager"; |
| 2 local modulemanager = require"core.modulemanager"; | |
| 2 local id = require "util.id"; | 3 local id = require "util.id"; |
| 3 local jid = require "util.jid"; | 4 local jid = require "util.jid"; |
| 4 local jid_join = jid.join; | 5 local jid_join = jid.join; |
| 5 local host = module.host; | 6 local host = module.host; |
| 6 | 7 |
| 7 local group_info_store = module:open_store("group_info"); | 8 local group_info_store = module:open_store("group_info"); |
| 8 local group_members_store = module:open_store("groups"); | 9 local group_members_store = module:open_store("groups"); |
| 9 local group_memberships = module:open_store("groups", "map"); | 10 local group_memberships = module:open_store("groups", "map"); |
| 11 | |
| 12 local muc_host_name = module:get_option("groups_muc_host", "chats."..host); | |
| 13 local muc_host = nil; | |
| 10 | 14 |
| 11 local is_contact_subscribed = rostermanager.is_contact_subscribed; | 15 local is_contact_subscribed = rostermanager.is_contact_subscribed; |
| 12 | 16 |
| 13 -- Make a *one-way* subscription. User will see when contact is online, | 17 -- Make a *one-way* subscription. User will see when contact is online, |
| 14 -- contact will not see when user is online. | 18 -- contact will not see when user is online. |
| 94 end | 98 end |
| 95 else | 99 else |
| 96 group_id = id.short(); | 100 group_id = id.short(); |
| 97 end | 101 end |
| 98 | 102 |
| 103 local muc_jid = nil | |
| 104 local room = nil | |
| 99 if create_muc then | 105 if create_muc then |
| 100 return nil, "not-implemented"; | 106 if not muc_host_name then |
| 107 module:log("error", "cannot create group with MUC: no MUC host configured") | |
| 108 return nil, "service-unavailable" | |
| 109 end | |
| 110 if not muc_host then | |
| 111 module:log("error", "cannot create group with MUC: MUC host %s not configured properly", muc_host_name) | |
| 112 return nil, "internal-server-error" | |
| 113 end | |
| 114 | |
| 115 muc_jid = id.short() .. "@" .. muc_host_name | |
| 116 room = muc_host.create_room(muc_jid) | |
| 117 if not room then | |
| 118 delete_group(group_id) | |
| 119 return nil, "internal-server-error" | |
| 120 end | |
| 121 room:set_public(false) | |
| 122 room:set_persistent(true) | |
| 123 room:set_members_only(true) | |
| 124 room:set_allow_member_invites(false) | |
| 125 room:set_moderated(false) | |
| 126 room:set_whois("anyone") | |
| 101 end | 127 end |
| 102 | 128 |
| 103 local ok = group_info_store:set(group_id, { | 129 local ok = group_info_store:set(group_id, { |
| 104 name = group_info.name; | 130 name = group_info.name; |
| 131 muc_jid = muc_jid; | |
| 105 }); | 132 }); |
| 106 if not ok then | 133 if not ok then |
| 107 return nil, "internal-server-error"; | 134 if room then |
| 108 end | 135 muc_host:delete_room(room) |
| 136 end | |
| 137 return nil, "internal-server-error"; | |
| 138 end | |
| 139 | |
| 109 return group_id; | 140 return group_id; |
| 110 end | 141 end |
| 111 | 142 |
| 112 function get_info(group_id) | 143 function get_info(group_id) |
| 113 return group_info_store:get(group_id); | 144 return group_info_store:get(group_id); |
| 188 | 219 |
| 189 -- Returns iterator over group ids | 220 -- Returns iterator over group ids |
| 190 function groups() | 221 function groups() |
| 191 return group_info_store:users(); | 222 return group_info_store:users(); |
| 192 end | 223 end |
| 224 | |
| 225 local function handle_server_started() | |
| 226 local target_module = modulemanager.get_module(muc_host_name, "muc") | |
| 227 if not target_module then | |
| 228 module:log("error", "host %s is not a MUC host -- group management will not work correctly", muc_host_name) | |
| 229 else | |
| 230 module:log("debug", "found MUC host") | |
| 231 muc_host = target_module; | |
| 232 end | |
| 233 end | |
| 234 | |
| 235 module:hook_global("server-started", handle_server_started) |
