plugin.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /**
  2. * @copyright The Converse.js contributors
  3. * @license Mozilla Public License (MPLv2)
  4. */
  5. import "../status/index.js";
  6. import VCard from './vcard.js';
  7. import _converse from '../../shared/_converse.js';
  8. import api from '../../shared/api/index.js';
  9. import converse from '../../shared/api/public.js';
  10. import vcard_api from './api.js';
  11. import VCards from "./vcards";
  12. import {
  13. clearVCardsSession,
  14. initVCardCollection,
  15. onOccupantAvatarChanged,
  16. setVCardOnMUCMessage,
  17. setVCardOnModel,
  18. setVCardOnOccupant,
  19. } from './utils.js';
  20. const { Strophe } = converse.env;
  21. converse.plugins.add('converse-vcard', {
  22. dependencies: ["converse-status", "converse-roster"],
  23. // Overrides mentioned here will be picked up by converse.js's
  24. // plugin architecture they will replace existing methods on the
  25. // relevant objects or classes.
  26. // New functions which don't exist yet can also be added.
  27. overrides: {
  28. XMPPStatus: {
  29. getNickname () {
  30. const { _converse } = this.__super__;
  31. const { xmppstatus } = _converse.state;
  32. const nick = this.__super__.getNickname.apply(this);
  33. if (!nick && xmppstatus?.vcard) {
  34. return xmppstatus.vcard.get('nickname');
  35. } else {
  36. return nick;
  37. }
  38. },
  39. getFullname () {
  40. const { _converse } = this.__super__;
  41. const { xmppstatus } = _converse.state;
  42. const fullname = this.__super__.getFullname.apply(this);
  43. if (!fullname && xmppstatus?.vcard) {
  44. return xmppstatus.vcard.get('fullname');
  45. } else {
  46. return fullname;
  47. }
  48. }
  49. },
  50. RosterContact: {
  51. getDisplayName () {
  52. if (!this.get('nickname') && this.vcard) {
  53. return this.vcard.getDisplayName();
  54. } else {
  55. return this.__super__.getDisplayName.apply(this);
  56. }
  57. },
  58. getFullname () {
  59. if (this.vcard) {
  60. return this.vcard.get('fullname');
  61. } else {
  62. return this.__super__.getFullname.apply(this);
  63. }
  64. }
  65. }
  66. },
  67. initialize () {
  68. api.promises.add('VCardsInitialized');
  69. const exports = { VCard, VCards };
  70. Object.assign(_converse, exports); // XXX DEPRECATED
  71. Object.assign(_converse.exports, exports);
  72. api.listen.on('chatRoomInitialized', (m) => {
  73. setVCardOnModel(m)
  74. m.occupants.forEach(setVCardOnOccupant);
  75. m.listenTo(m.occupants, 'add', setVCardOnOccupant);
  76. m.listenTo(m.occupants, 'change:image_hash', o => onOccupantAvatarChanged(o));
  77. });
  78. api.listen.on('chatBoxInitialized', m => setVCardOnModel(m));
  79. api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m));
  80. api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.VCARD));
  81. api.listen.on('clearSession', () => clearVCardsSession());
  82. api.listen.on('messageInitialized', m => setVCardOnModel(m));
  83. api.listen.on('rosterContactInitialized', m => setVCardOnModel(m));
  84. api.listen.on('statusInitialized', initVCardCollection);
  85. Object.assign(_converse.api, vcard_api);
  86. }
  87. });