summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/im/modules/chatHandler.sys.mjs
blob: 4b54535aa55293c380aab011aaa3b4d237a94851 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

import { IMServices } from "resource:///modules/IMServices.sys.mjs";

const { MailServices } = ChromeUtils.import(
  "resource:///modules/MailServices.jsm"
);

export var allContacts = {};
export var onlineContacts = {};

export var ChatCore = {
  initialized: false,
  _initializing: false,
  init() {
    if (this._initializing) {
      return;
    }
    this._initializing = true;

    Services.obs.addObserver(this, "browser-request");
    Services.obs.addObserver(this, "contact-signed-on");
    Services.obs.addObserver(this, "contact-signed-off");
    Services.obs.addObserver(this, "contact-added");
    Services.obs.addObserver(this, "contact-removed");
  },
  idleStart() {
    IMServices.core.init();

    // Find the accounts that exist in the im account service but
    // not in nsMsgAccountManager. They have probably been lost if
    // the user has used an older version of Thunderbird on a
    // profile with IM accounts. See bug 736035.
    let accountsById = {};
    for (let account of IMServices.accounts.getAccounts()) {
      accountsById[account.numericId] = account;
    }
    for (let account of MailServices.accounts.accounts) {
      let incomingServer = account.incomingServer;
      if (!incomingServer || incomingServer.type != "im") {
        continue;
      }
      delete accountsById[incomingServer.wrappedJSObject.imAccount.numericId];
    }
    // Let's recreate each of them...
    for (let id in accountsById) {
      let account = accountsById[id];
      let inServer = MailServices.accounts.createIncomingServer(
        account.name,
        account.protocol.id, // hostname
        "im"
      );
      inServer.wrappedJSObject.imAccount = account;
      let acc = MailServices.accounts.createAccount();
      // Avoid new folder notifications.
      inServer.valid = false;
      acc.incomingServer = inServer;
      inServer.valid = true;
      MailServices.accounts.notifyServerLoaded(inServer);
    }

    IMServices.tags.getTags().forEach(function (aTag) {
      aTag.getContacts().forEach(function (aContact) {
        let name = aContact.preferredBuddy.normalizedName;
        allContacts[name] = aContact;
      });
    });

    ChatCore.initialized = true;
    Services.obs.notifyObservers(null, "chat-core-initialized");
    ChatCore._initializing = false;
  },
  observe(aSubject, aTopic, aData) {
    if (aTopic == "browser-request") {
      Services.ww.openWindow(
        null,
        "chrome://messenger/content/browserRequest.xhtml",
        null,
        "chrome,private,centerscreen,width=980,height=750",
        aSubject
      );
      return;
    }

    if (aTopic == "contact-signed-on") {
      onlineContacts[aSubject.preferredBuddy.normalizedName] = aSubject;
      return;
    }

    if (aTopic == "contact-signed-off") {
      delete onlineContacts[aSubject.preferredBuddy.normalizedName];
      return;
    }

    if (aTopic == "contact-added") {
      allContacts[aSubject.preferredBuddy.normalizedName] = aSubject;
      return;
    }

    if (aTopic == "contact-removed") {
      delete allContacts[aSubject.preferredBuddy.normalizedName];
    }
  },
};