123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /**
- * @copyright The Converse.js contributors
- * @license Mozilla Public License (MPLv2)
- * @description Implements the core logic for XEP-0045 Multi-User Chat
- */
- import '../chat/index.js';
- import '../disco/index.js';
- import '../emoji/index.js';
- import MUCMessage from './message.js';
- import MUCMessages from './messages.js';
- import MUC from './muc.js';
- import MUCOccupant from './occupant.js';
- import MUCOccupants from './occupants.js';
- import affiliations_api from './affiliations/api.js';
- import muc_api from './api.js';
- import _converse from '../../shared/_converse.js';
- import api from '../../shared/api/index.js';
- import converse from '../../shared/api/public.js';
- import { CHATROOMS_TYPE } from '../../shared/constants.js';
- import {
- autoJoinRooms,
- disconnectChatRooms,
- getDefaultMUCNickname,
- isInfoVisible,
- onAddClientFeatures,
- onBeforeResourceBinding,
- onBeforeTearDown,
- onDirectMUCInvitation,
- onStatusInitialized,
- onWindowStateChanged,
- registerDirectInvitationHandler,
- routeToRoom,
- } from './utils.js';
- import { computeAffiliationsDelta } from './affiliations/utils.js';
- import {
- AFFILIATION_CHANGES,
- AFFILIATION_CHANGES_LIST,
- INFO_CODES,
- MUC_NICK_CHANGED_CODE,
- MUC_ROLE_CHANGES,
- MUC_ROLE_CHANGES_LIST,
- MUC_TRAFFIC_STATES,
- MUC_TRAFFIC_STATES_LIST,
- ROOMSTATUS,
- ROOM_FEATURES,
- } from './constants.js';
- converse.AFFILIATION_CHANGES = AFFILIATION_CHANGES;
- converse.AFFILIATION_CHANGES_LIST = AFFILIATION_CHANGES_LIST;
- converse.MUC_TRAFFIC_STATES = MUC_TRAFFIC_STATES;
- converse.MUC_TRAFFIC_STATES_LIST = MUC_TRAFFIC_STATES_LIST;
- converse.MUC_ROLE_CHANGES = MUC_ROLE_CHANGES;
- converse.MUC_ROLE_CHANGES_LIST = MUC_ROLE_CHANGES_LIST;
- converse.MUC = { INFO_CODES };
- converse.MUC_NICK_CHANGED_CODE = MUC_NICK_CHANGED_CODE;
- converse.ROOM_FEATURES = ROOM_FEATURES;
- converse.ROOMSTATUS = ROOMSTATUS;
- const { Strophe } = converse.env;
- // Add Strophe Namespaces
- Strophe.addNamespace('MUC_ADMIN', Strophe.NS.MUC + '#admin');
- Strophe.addNamespace('MUC_OWNER', Strophe.NS.MUC + '#owner');
- Strophe.addNamespace('MUC_REGISTER', 'jabber:iq:register');
- Strophe.addNamespace('MUC_ROOMCONF', Strophe.NS.MUC + '#roomconfig');
- Strophe.addNamespace('MUC_USER', Strophe.NS.MUC + '#user');
- Strophe.addNamespace('MUC_HATS', 'urn:xmpp:hats:0');
- Strophe.addNamespace('CONFINFO', 'urn:ietf:params:xml:ns:conference-info');
- converse.plugins.add('converse-muc', {
- dependencies: ['converse-chatboxes', 'converse-chat', 'converse-disco'],
- initialize () {
- /* The initialize function gets called as soon as the plugin is
- * loaded by converse.js's plugin machinery.
- */
- const { __, ___ } = _converse;
- // Configuration values for this plugin
- // ====================================
- // Refer to docs/source/configuration.rst for explanations of these
- // configuration settings.
- api.settings.extend({
- allow_muc_invitations: true,
- auto_join_on_invite: false,
- auto_join_rooms: [],
- auto_register_muc_nickname: true,
- colorize_username: false,
- hide_muc_participants: false,
- locked_muc_domain: false,
- modtools_disable_assign: false,
- muc_clear_messages_on_leave: true,
- muc_domain: undefined,
- muc_fetch_members: true,
- muc_history_max_stanzas: undefined,
- muc_instant_rooms: true,
- muc_nickname_from_jid: false,
- muc_send_probes: false,
- muc_show_info_messages: [
- ...converse.MUC.INFO_CODES.visibility_changes,
- ...converse.MUC.INFO_CODES.self,
- ...converse.MUC.INFO_CODES.non_privacy_changes,
- ...converse.MUC.INFO_CODES.muc_logging_changes,
- ...converse.MUC.INFO_CODES.nickname_changes,
- ...converse.MUC.INFO_CODES.disconnected,
- ...converse.MUC.INFO_CODES.affiliation_changes,
- ...converse.MUC.INFO_CODES.join_leave_events,
- ...converse.MUC.INFO_CODES.role_changes,
- ],
- muc_show_logs_before_join: false,
- muc_subscribe_to_rai: false,
- });
- api.promises.add(['roomsAutoJoined']);
- if (api.settings.get('locked_muc_domain') && typeof api.settings.get('muc_domain') !== 'string') {
- throw new Error(
- 'Config Error: it makes no sense to set locked_muc_domain ' + 'to true when muc_domain is not set'
- );
- }
- // This is for tests (at least until we can import modules inside tests)
- converse.env.muc_utils = { computeAffiliationsDelta };
- Object.assign(api, muc_api);
- Object.assign(api.rooms, affiliations_api);
- /**
- * https://xmpp.org/extensions/xep-0045.html
- * -----------------------------------------
- */
- const STATUS_CODE_MESSAGES = {
- '100': __('This groupchat is not anonymous'),
- '102': __('This groupchat now shows unavailable members'),
- '103': __('This groupchat does not show unavailable members'),
- '104': __('The groupchat configuration has changed'),
- '170': __('Groupchat logging is now enabled'),
- '171': __('Groupchat logging is now disabled'),
- '172': __('This groupchat is now no longer anonymous'),
- '173': __('This groupchat is now semi-anonymous'),
- '174': __('This groupchat is now fully-anonymous'),
- '201': __('A new groupchat has been created'),
- // XXX: Note the triple underscore function and not double underscore.
- '210': ___('Your nickname has been automatically set to %1$s'),
- '301': __('You have been banned from this groupchat'),
- // XXX: Note the triple underscore function and not double underscore.
- '303': ___('Your nickname has been changed to %1$s'),
- '307': __('You have been kicked from this groupchat'),
- '321': __('You have been removed from this groupchat because of an affiliation change'),
- '322': __("You have been removed from this groupchat because it has changed to members-only and you're not a member"),
- '332': __('You have been removed from this groupchat because the service hosting it is being shut down'),
- '333': __('You have exited this groupchat due to a technical problem'),
- };
- const labels = { muc: { STATUS_CODE_MESSAGES }};
- Object.assign(_converse.labels, labels);
- Object.assign(_converse, labels); // XXX DEPRECATED
- routeToRoom();
- addEventListener('hashchange', routeToRoom);
- // TODO: DEPRECATED
- const legacy_exports = {
- ChatRoom: MUC,
- ChatRoomMessage: MUCMessage,
- ChatRoomMessages: MUCMessages,
- ChatRoomOccupant: MUCOccupant,
- ChatRoomOccupants: MUCOccupants,
- };
- Object.assign(_converse, legacy_exports);
- const exports = {
- MUC,
- MUCMessage,
- MUCMessages,
- MUCOccupant,
- MUCOccupants,
- getDefaultMUCNickname,
- isInfoVisible,
- onDirectMUCInvitation,
- };
- Object.assign(_converse.exports, exports);
- Object.assign(_converse, exports); // XXX DEPRECATED
- /** @type {module:shared-api.APIEndpoint} */(api.chatboxes.registry).add(CHATROOMS_TYPE, MUC);
- if (api.settings.get('allow_muc_invitations')) {
- api.listen.on('connected', registerDirectInvitationHandler);
- api.listen.on('reconnected', registerDirectInvitationHandler);
- }
- api.listen.on('addClientFeatures', () => api.disco.own.features.add(`${Strophe.NS.CONFINFO}+notify`));
- api.listen.on('addClientFeatures', onAddClientFeatures);
- api.listen.on('beforeResourceBinding', onBeforeResourceBinding);
- api.listen.on('beforeTearDown', onBeforeTearDown);
- api.listen.on('chatBoxesFetched', autoJoinRooms);
- api.listen.on('disconnected', disconnectChatRooms);
- api.listen.on('statusInitialized', onStatusInitialized);
- document.addEventListener('visibilitychange', onWindowStateChanged);
- },
- });
|