Welcome to mirror list, hosted at ThFree Co, Russian Federation.

chatMessage.ts « handlers « xmpp « connection « src - github.com/jsxc/jsxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d95fdec0c8ee05721582c3c50d865a402f98e31a (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
import Log from '../../../util/Log';
import JID from '../../../JID';
import Message from '../../../Message';
import Utils from '../../../util/Utils';
import Translation from '../../../util/Translation';
import AbstractHandler from '../AbstractHandler';
import { FUNCTION } from '../../../Notice';
import { MessageMark } from '@src/Message.interface';
import { MessageElement } from '../MessageElement';

export default class extends AbstractHandler {
   public processStanza(stanza: Element) {
      let messageElement: MessageElement;

      try {
         messageElement = new MessageElement(stanza);
      } catch (err) {
         return this.PRESERVE_HANDLER;
      }

      if (!messageElement.getPeer()) {
         return this.PRESERVE_HANDLER;
      }

      let peerJid = new JID(messageElement.getPeer());
      let peerContact = this.account.getContact(peerJid);
      if (typeof peerContact === 'undefined') {
         this.handleUnknownSender(messageElement);

         return this.PRESERVE_HANDLER;
      }

      if (!peerContact.isGroupChat()) {
         // If we now the full jid, we use it
         peerContact.setResource(peerJid.resource);
      }

      let message = new Message({
         uid: messageElement.getStanzaId(),
         attrId: messageElement.getId(),
         peer: peerJid,
         direction: messageElement.getDirection(),
         plaintextMessage: messageElement.getPlaintextBody(),
         htmlMessage: messageElement.getHtmlBody().html(),
         forwarded: messageElement.isForwarded(),
         stamp: messageElement.getTime().getTime(),
         unread: messageElement.isIncoming(),
         mark: MessageMark.transferred,
      });

      let pipe = this.account.getPipe('afterReceiveMessage');

      pipe.run(peerContact, message, messageElement.get(0)).then(([contact, message]) => {
         if (!message) {
            return;
         }

         if (message.getPlaintextMessage() || message.getHtmlMessage() || message.hasAttachment()) {
            contact.getTranscript().pushMessage(message);
         } else {
            message.delete();
         }
      });

      return this.PRESERVE_HANDLER;
   }

   private handleUnknownSender(messageElement: MessageElement) {
      Log.debug('Sender is not in our contact list');

      let fromJid = new JID(messageElement.getFrom());

      let title = Translation.t('Unknown_sender');
      let description = Translation.t('You_received_a_message_from_an_unknown_sender_', {
         sender: fromJid.bare,
      });

      description += `\n\n>>>${Utils.escapeHTML(messageElement.getPlaintextBody())}<<<`;

      //@REVIEW maybe improve the dialog
      this.account.getNoticeManager().addNotice({
         title,
         description,
         fnName: FUNCTION.unknownSender,
         fnParams: [this.account.getUid(), title, description, fromJid.full],
      });
   }
}