plugin.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /**
  2. * @copyright The Converse.js contributors
  3. * @license Mozilla Public License (MPLv2)
  4. * @description Implements the core logic for XEP-0045 Multi-User Chat
  5. */
  6. import '../chat/index.js';
  7. import '../disco/index.js';
  8. import '../emoji/index.js';
  9. import MUCMessage from './message.js';
  10. import MUCMessages from './messages.js';
  11. import MUC from './muc.js';
  12. import MUCOccupant from './occupant.js';
  13. import MUCOccupants from './occupants.js';
  14. import affiliations_api from './affiliations/api.js';
  15. import muc_api from './api.js';
  16. import _converse from '../../shared/_converse.js';
  17. import api from '../../shared/api/index.js';
  18. import converse from '../../shared/api/public.js';
  19. import { CHATROOMS_TYPE } from '../../shared/constants.js';
  20. import {
  21. autoJoinRooms,
  22. disconnectChatRooms,
  23. getDefaultMUCNickname,
  24. isInfoVisible,
  25. onAddClientFeatures,
  26. onBeforeResourceBinding,
  27. onBeforeTearDown,
  28. onDirectMUCInvitation,
  29. onStatusInitialized,
  30. onWindowStateChanged,
  31. registerDirectInvitationHandler,
  32. routeToRoom,
  33. } from './utils.js';
  34. import { computeAffiliationsDelta } from './affiliations/utils.js';
  35. import {
  36. AFFILIATION_CHANGES,
  37. AFFILIATION_CHANGES_LIST,
  38. INFO_CODES,
  39. MUC_NICK_CHANGED_CODE,
  40. MUC_ROLE_CHANGES,
  41. MUC_ROLE_CHANGES_LIST,
  42. MUC_TRAFFIC_STATES,
  43. MUC_TRAFFIC_STATES_LIST,
  44. ROOMSTATUS,
  45. ROOM_FEATURES,
  46. } from './constants.js';
  47. converse.AFFILIATION_CHANGES = AFFILIATION_CHANGES;
  48. converse.AFFILIATION_CHANGES_LIST = AFFILIATION_CHANGES_LIST;
  49. converse.MUC_TRAFFIC_STATES = MUC_TRAFFIC_STATES;
  50. converse.MUC_TRAFFIC_STATES_LIST = MUC_TRAFFIC_STATES_LIST;
  51. converse.MUC_ROLE_CHANGES = MUC_ROLE_CHANGES;
  52. converse.MUC_ROLE_CHANGES_LIST = MUC_ROLE_CHANGES_LIST;
  53. converse.MUC = { INFO_CODES };
  54. converse.MUC_NICK_CHANGED_CODE = MUC_NICK_CHANGED_CODE;
  55. converse.ROOM_FEATURES = ROOM_FEATURES;
  56. converse.ROOMSTATUS = ROOMSTATUS;
  57. const { Strophe } = converse.env;
  58. // Add Strophe Namespaces
  59. Strophe.addNamespace('MUC_ADMIN', Strophe.NS.MUC + '#admin');
  60. Strophe.addNamespace('MUC_OWNER', Strophe.NS.MUC + '#owner');
  61. Strophe.addNamespace('MUC_REGISTER', 'jabber:iq:register');
  62. Strophe.addNamespace('MUC_ROOMCONF', Strophe.NS.MUC + '#roomconfig');
  63. Strophe.addNamespace('MUC_USER', Strophe.NS.MUC + '#user');
  64. Strophe.addNamespace('MUC_HATS', 'urn:xmpp:hats:0');
  65. Strophe.addNamespace('CONFINFO', 'urn:ietf:params:xml:ns:conference-info');
  66. converse.plugins.add('converse-muc', {
  67. dependencies: ['converse-chatboxes', 'converse-chat', 'converse-disco'],
  68. initialize () {
  69. /* The initialize function gets called as soon as the plugin is
  70. * loaded by converse.js's plugin machinery.
  71. */
  72. const { __, ___ } = _converse;
  73. // Configuration values for this plugin
  74. // ====================================
  75. // Refer to docs/source/configuration.rst for explanations of these
  76. // configuration settings.
  77. api.settings.extend({
  78. allow_muc_invitations: true,
  79. auto_join_on_invite: false,
  80. auto_join_rooms: [],
  81. auto_register_muc_nickname: true,
  82. colorize_username: false,
  83. hide_muc_participants: false,
  84. locked_muc_domain: false,
  85. modtools_disable_assign: false,
  86. muc_clear_messages_on_leave: true,
  87. muc_domain: undefined,
  88. muc_fetch_members: true,
  89. muc_history_max_stanzas: undefined,
  90. muc_instant_rooms: true,
  91. muc_nickname_from_jid: false,
  92. muc_send_probes: false,
  93. muc_show_info_messages: [
  94. ...converse.MUC.INFO_CODES.visibility_changes,
  95. ...converse.MUC.INFO_CODES.self,
  96. ...converse.MUC.INFO_CODES.non_privacy_changes,
  97. ...converse.MUC.INFO_CODES.muc_logging_changes,
  98. ...converse.MUC.INFO_CODES.nickname_changes,
  99. ...converse.MUC.INFO_CODES.disconnected,
  100. ...converse.MUC.INFO_CODES.affiliation_changes,
  101. ...converse.MUC.INFO_CODES.join_leave_events,
  102. ...converse.MUC.INFO_CODES.role_changes,
  103. ],
  104. muc_show_logs_before_join: false,
  105. muc_subscribe_to_rai: false,
  106. });
  107. api.promises.add(['roomsAutoJoined']);
  108. if (api.settings.get('locked_muc_domain') && typeof api.settings.get('muc_domain') !== 'string') {
  109. throw new Error(
  110. 'Config Error: it makes no sense to set locked_muc_domain ' + 'to true when muc_domain is not set'
  111. );
  112. }
  113. // This is for tests (at least until we can import modules inside tests)
  114. converse.env.muc_utils = { computeAffiliationsDelta };
  115. Object.assign(api, muc_api);
  116. Object.assign(api.rooms, affiliations_api);
  117. /**
  118. * https://xmpp.org/extensions/xep-0045.html
  119. * -----------------------------------------
  120. */
  121. const STATUS_CODE_MESSAGES = {
  122. '100': __('This groupchat is not anonymous'),
  123. '102': __('This groupchat now shows unavailable members'),
  124. '103': __('This groupchat does not show unavailable members'),
  125. '104': __('The groupchat configuration has changed'),
  126. '170': __('Groupchat logging is now enabled'),
  127. '171': __('Groupchat logging is now disabled'),
  128. '172': __('This groupchat is now no longer anonymous'),
  129. '173': __('This groupchat is now semi-anonymous'),
  130. '174': __('This groupchat is now fully-anonymous'),
  131. '201': __('A new groupchat has been created'),
  132. // XXX: Note the triple underscore function and not double underscore.
  133. '210': ___('Your nickname has been automatically set to %1$s'),
  134. '301': __('You have been banned from this groupchat'),
  135. // XXX: Note the triple underscore function and not double underscore.
  136. '303': ___('Your nickname has been changed to %1$s'),
  137. '307': __('You have been kicked from this groupchat'),
  138. '321': __('You have been removed from this groupchat because of an affiliation change'),
  139. '322': __("You have been removed from this groupchat because it has changed to members-only and you're not a member"),
  140. '332': __('You have been removed from this groupchat because the service hosting it is being shut down'),
  141. '333': __('You have exited this groupchat due to a technical problem'),
  142. };
  143. const labels = { muc: { STATUS_CODE_MESSAGES }};
  144. Object.assign(_converse.labels, labels);
  145. Object.assign(_converse, labels); // XXX DEPRECATED
  146. routeToRoom();
  147. addEventListener('hashchange', routeToRoom);
  148. // TODO: DEPRECATED
  149. const legacy_exports = {
  150. ChatRoom: MUC,
  151. ChatRoomMessage: MUCMessage,
  152. ChatRoomMessages: MUCMessages,
  153. ChatRoomOccupant: MUCOccupant,
  154. ChatRoomOccupants: MUCOccupants,
  155. };
  156. Object.assign(_converse, legacy_exports);
  157. const exports = {
  158. MUC,
  159. MUCMessage,
  160. MUCMessages,
  161. MUCOccupant,
  162. MUCOccupants,
  163. getDefaultMUCNickname,
  164. isInfoVisible,
  165. onDirectMUCInvitation,
  166. };
  167. Object.assign(_converse.exports, exports);
  168. Object.assign(_converse, exports); // XXX DEPRECATED
  169. /** @type {module:shared-api.APIEndpoint} */(api.chatboxes.registry).add(CHATROOMS_TYPE, MUC);
  170. if (api.settings.get('allow_muc_invitations')) {
  171. api.listen.on('connected', registerDirectInvitationHandler);
  172. api.listen.on('reconnected', registerDirectInvitationHandler);
  173. }
  174. api.listen.on('addClientFeatures', () => api.disco.own.features.add(`${Strophe.NS.CONFINFO}+notify`));
  175. api.listen.on('addClientFeatures', onAddClientFeatures);
  176. api.listen.on('beforeResourceBinding', onBeforeResourceBinding);
  177. api.listen.on('beforeTearDown', onBeforeTearDown);
  178. api.listen.on('chatBoxesFetched', autoJoinRooms);
  179. api.listen.on('disconnected', disconnectChatRooms);
  180. api.listen.on('statusInitialized', onStatusInitialized);
  181. document.addEventListener('visibilitychange', onWindowStateChanged);
  182. },
  183. });