From 03a46be5c77797519ea01c2759fb0f9507944fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 20 Mar 2020 20:31:45 +0100 Subject: [PATCH] telepathyClient: Use proper Object to wrap different tpl messages In telepathyClient we consider messages both Tpl.TextEvents and Tpl.Messages, and we manually create JS objects to copy the properties we care for each one. This may lead to objects not matching the interface we want. Instead, use an object with construct-only properties and two factory static methods to initialize it. Unfortunately we need to use the ChatMessageClass for the class name or calling the static methods would trigger a gjs error as per [1]. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1113 [1] https://gitlab.gnome.org/GNOME/gjs/-/issues/310 --- js/ui/components/telepathyClient.js | 86 +++++++++++++++++++---------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/js/ui/components/telepathyClient.js b/js/ui/components/telepathyClient.js index cdb7f57f5..5a65e84e8 100644 --- a/js/ui/components/telepathyClient.js +++ b/js/ui/components/telepathyClient.js @@ -39,36 +39,59 @@ var NotificationDirection = { RECEIVED: 'chat-received', }; -function makeMessageFromTpMessage(tpMessage, direction) { - let [text, flags_] = tpMessage.to_text(); +const ChatMessage = HAVE_TP ? GObject.registerClass({ + Properties: { + 'message-type': GObject.ParamSpec.int( + 'message-type', 'message-type', 'message-type', + GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY, + Math.min(...Object.values(Tp.ChannelTextMessageType)), + Math.max(...Object.values(Tp.ChannelTextMessageType)), + Tp.ChannelTextMessageType.NORMAL), + 'text': GObject.ParamSpec.string( + 'text', 'text', 'text', + GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY, + null), + 'sender': GObject.ParamSpec.string( + 'sender', 'sender', 'sender', + GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY, + null), + 'timestamp': GObject.ParamSpec.int64( + 'timestamp', 'timestamp', 'timestamp', + GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY, + 0, Number.MAX_SAFE_INTEGER, 0), + 'direction': GObject.ParamSpec.string( + 'direction', 'direction', 'direction', + GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY, + null), + }, +}, class ChatMessageClass extends GObject.Object { + static newFromTpMessage(tpMessage, direction) { + return new ChatMessage({ + 'message-type': tpMessage.get_message_type(), + 'text': tpMessage.to_text()[0], + 'sender': tpMessage.sender.alias, + 'timestamp': direction === NotificationDirection.RECEIVED + ? tpMessage.get_received_timestamp() : tpMessage.get_sent_timestamp(), + direction, + }); + } - let timestamp = tpMessage.get_sent_timestamp(); - if (timestamp == 0) - timestamp = tpMessage.get_received_timestamp(); + static newFromTplTextEvent(tplTextEvent) { + let direction = + tplTextEvent.get_sender().get_entity_type() === Tpl.EntityType.SELF + ? NotificationDirection.SENT : NotificationDirection.RECEIVED; - return { - messageType: tpMessage.get_message_type(), - text, - sender: tpMessage.sender.alias, - timestamp, - direction, - }; -} + return new ChatMessage({ + 'message-type': tplTextEvent.get_message_type(), + 'text': tplTextEvent.get_message(), + 'sender': tplTextEvent.get_sender().get_alias(), + 'timestamp': tplTextEvent.get_timestamp(), + direction, + }); + } +}) : null; -function makeMessageFromTplEvent(event) { - let sent = event.get_sender().get_entity_type() == Tpl.EntityType.SELF; - let direction = sent ? NotificationDirection.SENT : NotificationDirection.RECEIVED; - - return { - messageType: event.get_message_type(), - text: event.get_message(), - sender: event.get_sender().get_alias(), - timestamp: event.get_timestamp(), - direction, - }; -} - var TelepathyComponent = class { constructor() { this._client = null; @@ -430,7 +453,7 @@ class ChatSource extends MessageTray.Source { _displayPendingMessages(logManager, result) { let [success_, events] = logManager.get_filtered_events_finish(result); - let logMessages = events.map(makeMessageFromTplEvent); + let logMessages = events.map(e => ChatMessage.newFromTplTextEvent(e)); this._ensureNotification(); let pendingTpMessages = this._channel.get_pending_messages(); @@ -442,7 +465,8 @@ class ChatSource extends MessageTray.Source { if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT) continue; - pendingMessages.push(makeMessageFromTpMessage(message, NotificationDirection.RECEIVED)); + pendingMessages.push(ChatMessage.newFromTpMessage(message, + NotificationDirection.RECEIVED)); this._pendingMessages.push(message); } @@ -540,7 +564,8 @@ class ChatSource extends MessageTray.Source { this._pendingMessages.push(message); this.countUpdated(); - message = makeMessageFromTpMessage(message, NotificationDirection.RECEIVED); + message = ChatMessage.newFromTpMessage(message, + NotificationDirection.RECEIVED); this._notification.appendMessage(message); // Wait a bit before notifying for the received message, a handler @@ -565,7 +590,8 @@ class ChatSource extends MessageTray.Source { // our client and other clients as well. _messageSent(channel, message, _flags, _token) { this._ensureNotification(); - message = makeMessageFromTpMessage(message, NotificationDirection.SENT); + message = ChatMessage.newFromTpMessage(message, + NotificationDirection.SENT); this._notification.appendMessage(message); }