From dd0e9de324d96a340abd59a3ad35fe68798bf5b9 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Wed, 3 Jun 2020 16:33:36 -0400 Subject: [PATCH] refactor: code cleanup --- src/app/chat/core.nim | 29 ++++++++----------- src/app/chat/view.nim | 6 ++-- src/app/chat/views/chat_item.nim | 4 +++ src/signals/core.nim | 3 +- src/status/chat.nim | 28 +++++++----------- src/status/libstatus/chat.nim | 16 +--------- src/status/libstatus/core.nim | 2 +- src/status/libstatus/mailservers.nim | 17 ++++++++++- src/status/mailservers.nim | 10 +++---- .../Chat/components/PrivateChatPopup.qml | 2 +- ui/shared/ModalPopup.qml | 2 +- ui/{app => shared}/img/close.svg | 0 12 files changed, 56 insertions(+), 63 deletions(-) rename ui/{app => shared}/img/close.svg (100%) diff --git a/src/app/chat/core.nim b/src/app/chat/core.nim index f901e23184..57912dfccb 100644 --- a/src/app/chat/core.nim +++ b/src/app/chat/core.nim @@ -1,5 +1,5 @@ import NimQml -import json, eventemitter, chronicles +import eventemitter, chronicles import ../../status/chat as chat_model import ../../status/mailservers as mailserver_model import ../../signals/types @@ -29,11 +29,11 @@ proc delete*(self: ChatController) = delete self.variant proc handleChatEvents(self: ChatController) = + # Display already saved messages self.status.events.on("messagesLoaded") do(e:Args): for message in MsgsLoadedArgs(e).messages: self.view.pushMessage(message.chatId, message.toChatMessage()) - self.status.events.on("messageSent") do(e: Args): var sentMessage = MsgArgs(e) var chatMessage = sentMessage.payload.toChatMessage() @@ -62,7 +62,6 @@ proc handleMailserverEvents(self: ChatController) = self.status.events.on("mailserverAvailable") do(e:Args): self.status.mailservers.requestMessages() - proc init*(self: ChatController) = self.handleMailserverEvents() self.handleChatEvents() @@ -72,24 +71,20 @@ proc init*(self: ChatController) = self.view.setActiveChannelByIndex(0) -proc handleMessage(self: ChatController, data: Signal) = - var messageSignal = cast[MessageSignal](data) +proc handleMessage(self: ChatController, data: MessageSignal) = + for c in data.chats: + self.view.updateChat(c.toChatItem()) - for c in messageSignal.chats: - let channel = c.toChatItem() - self.view.updateChat(channel) + for message in data.messages: + self.view.pushMessage(message.localChatId, message.toChatMessage()) - for message in messageSignal.messages: - let chatMessage = message.toChatMessage() - self.view.pushMessage(message.localChatId, chatMessage) - -proc handleDiscoverySummary(self: ChatController, data: Signal) = - var discovery = DiscoverySummarySignal(data) - self.status.mailservers.peerSummaryChange(discovery.enodes) +proc handleDiscoverySummary(self: ChatController, data: DiscoverySummarySignal) = + ## Handle mailserver peers being added and removed + self.status.mailservers.peerSummaryChange(data.enodes) method onSignal(self: ChatController, data: Signal) = case data.signalType: - of SignalType.Message: handleMessage(self, data) - of SignalType.DiscoverySummary: handleDiscoverySummary(self, data) + of SignalType.Message: handleMessage(self, MessageSignal(data)) + of SignalType.DiscoverySummary: handleDiscoverySummary(self, DiscoverySummarySignal(data)) else: warn "Unhandled signal received", signalType = data.signalType diff --git a/src/app/chat/view.nim b/src/app/chat/view.nim index 168c25aee3..874674f0f8 100644 --- a/src/app/chat/view.nim +++ b/src/app/chat/view.nim @@ -32,7 +32,7 @@ QtObject: result.setup() proc getChatsList(self: ChatsView): QVariant {.slot.} = - return newQVariant(self.chats) + newQVariant(self.chats) QtProperty[QVariant] chats: read = getChatsList @@ -53,7 +53,7 @@ QtObject: self.activeChannelChanged() proc getActiveChannelIdx(self: ChatsView): QVariant {.slot.} = - return newQVariant(self.chats.chats.findById(self.activeChannel.id)) + newQVariant(self.chats.chats.findById(self.activeChannel.id)) QtProperty[QVariant] activeChannelIndex: read = getActiveChannelIdx @@ -65,7 +65,7 @@ QtObject: self.activeChannelChanged() proc getActiveChannel*(self: ChatsView): QVariant {.slot.} = - result = newQVariant(self.activeChannel) + newQVariant(self.activeChannel) QtProperty[QVariant] activeChannel: read = getActiveChannel diff --git a/src/app/chat/views/chat_item.nim b/src/app/chat/views/chat_item.nim index b2f883932b..75a1c7b53c 100644 --- a/src/app/chat/views/chat_item.nim +++ b/src/app/chat/views/chat_item.nim @@ -21,14 +21,17 @@ QtObject: self.chatItem = chatItem proc id*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.id + QtProperty[string] id: read = id proc name*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.name + QtProperty[string] name: read = name proc identicon*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.identicon + QtProperty[string] identicon: read = identicon @@ -37,5 +40,6 @@ QtObject: result = self.chatItem.chatType.int else: result = 0 + QtProperty[int] chatType: read = chatType diff --git a/src/signals/core.nim b/src/signals/core.nim index 2c5d70e370..2f97ecd9b8 100644 --- a/src/signals/core.nim +++ b/src/signals/core.nim @@ -97,4 +97,5 @@ QtObject: QtProperty[string] statusSignal: read = statusSignal write = receiveSignal - notify = signalReceived \ No newline at end of file + notify = signalReceived + \ No newline at end of file diff --git a/src/status/chat.nim b/src/status/chat.nim index a96602562c..64b00f2a23 100644 --- a/src/status/chat.nim +++ b/src/status/chat.nim @@ -1,36 +1,34 @@ -import eventemitter, sets, json, strutils +import eventemitter, sets, json import sequtils -import libstatus/utils -import libstatus/core as status_core import libstatus/chat as status_chat -import libstatus/mailservers as status_mailservers import chronicles import ../signals/types import chat/chat_item import chat/chat_message import tables + export chat_item export chat_message -type MsgArgs* = ref object of Args +type + MsgArgs* = ref object of Args message*: string chatId*: string payload*: JsonNode -type ChannelArgs* = ref object of Args + ChannelArgs* = ref object of Args channel*: string chatTypeInt*: ChatType -type ChatArgs* = ref object of Args - chats*: seq[Chat] + ChatArgs* = ref object of Args + chats*: seq[Chat] -type TopicArgs* = ref object of Args - topics*: seq[string] + TopicArgs* = ref object of Args + topics*: seq[string] -type MsgsLoadedArgs* = ref object of Args - messages*: seq[Message] + MsgsLoadedArgs* = ref object of Args + messages*: seq[Message] -type ChatModel* = ref object events*: EventEmitter channels*: HashSet[string] @@ -69,11 +67,8 @@ proc join*(self: ChatModel, chatId: string, chatType: ChatType) = else: self.events.emit("mailserverTopics", TopicArgs(topics: topics)); - - self.events.emit("channelJoined", ChannelArgs(channel: chatId, chatTypeInt: chatType)) self.events.emit("activeChannelChanged", ChannelArgs(channel: self.getActiveChannel())) - proc init*(self: ChatModel) = let chatList = status_chat.loadChats() @@ -103,7 +98,6 @@ proc init*(self: ChatModel) = else: self.events.emit("mailserverTopics", TopicArgs(topics: topics)); - proc leave*(self: ChatModel, chatId: string) = status_chat.removeFilters(chatId, self.filters[chatId]) status_chat.deactivateChat(chatId) diff --git a/src/status/libstatus/chat.nim b/src/status/libstatus/chat.nim index 40694e41a9..5139357771 100644 --- a/src/status/libstatus/chat.nim +++ b/src/status/libstatus/chat.nim @@ -73,7 +73,7 @@ proc loadChats*(): seq[Chat] = proc chatMessages*(chatId: string): seq[Message] = result = @[] - let rpcResult = parseJson(callPrivateRPC("chatMessages".prefix, %* [chatId, nil, 5]))["result"] + let rpcResult = parseJson(callPrivateRPC("chatMessages".prefix, %* [chatId, nil, 1000]))["result"] if rpcResult["messages"].kind != JNull: for jsonMsg in rpcResult["messages"]: result.add(jsonMsg.toMessage) @@ -85,20 +85,6 @@ proc generateSymKeyFromPassword*(): string = "status-offline-inbox" ]))["result"]).strip(chars = {'"'}) -proc requestMessages*(topics: seq[string], symKeyID: string, peer: string, numberOfMessages: int) = - echo callPrivateRPC("requestMessages".prefix, %* [ - { - "topics": topics, - "mailServerPeer": peer, - "symKeyID": symKeyID, - "timeout": 30, - "limit": numberOfMessages, - "cursor": nil, - "from": (times.toUnix(times.getTime()) - 86400) # Unhardcode this. Need to keep the last fetch in a DB - } - ]) - - proc sendChatMessage*(chatId: string, msg: string): string = callPrivateRPC("sendChatMessage".prefix, %* [ { diff --git a/src/status/libstatus/core.nim b/src/status/libstatus/core.nim index f768893f72..35987e3dea 100644 --- a/src/status/libstatus/core.nim +++ b/src/status/libstatus/core.nim @@ -39,7 +39,7 @@ proc addPeer*(peer: string) = discard callPrivateRPC("admin_addPeer", %* [peer]) proc removePeer*(peer: string) = - echo "TODO: removePeer" + discard callPrivateRPC("admin_removePeer", %* [peer]) proc markTrustedPeer*(peer: string) = discard callPrivateRPC("markTrustedPeer".prefix(false), %* [peer]) diff --git a/src/status/libstatus/mailservers.nim b/src/status/libstatus/mailservers.nim index 4e91ed5826..677e768e88 100644 --- a/src/status/libstatus/mailservers.nim +++ b/src/status/libstatus/mailservers.nim @@ -1,6 +1,7 @@ import core import json import utils +import times proc getMailservers*(): array[0..8, (string, string)] = result = [ @@ -57,4 +58,18 @@ proc update*(peer: string) = discard callPrivateRPC("updateMailservers".prefix, %* [[peer]]) proc delete*(peer: string) = - discard callPrivateRPC("mailservers_deleteMailserver".prefix, %* [[peer]]) \ No newline at end of file + discard callPrivateRPC("mailservers_deleteMailserver".prefix, %* [[peer]]) + + +proc requestMessages*(topics: seq[string], symKeyID: string, peer: string, numberOfMessages: int) = + echo callPrivateRPC("requestMessages".prefix, %* [ + { + "topics": topics, + "mailServerPeer": peer, + "symKeyID": symKeyID, + "timeout": 30, + "limit": numberOfMessages, + "cursor": nil, + "from": (times.toUnix(times.getTime()) - 86400) # Unhardcode this. Need to keep the last fetch in a DB + } + ]) \ No newline at end of file diff --git a/src/status/mailservers.nim b/src/status/mailservers.nim index 6f0bcf55bc..dd1380f76e 100644 --- a/src/status/mailservers.nim +++ b/src/status/mailservers.nim @@ -83,7 +83,7 @@ proc connect*(self: MailserverModel, enode: string) = return self.selectedMailserver = enode - if self.nodes.hasKey(enode): + if self.nodes.hasKey(enode) and self.nodes[enode] == MailserverStatus.Connecting: if self.nodes[enode] == MailserverStatus.Connected: self.trustPeer(enode) else: @@ -94,12 +94,9 @@ proc connect*(self: MailserverModel, enode: string) = status_mailservers.update(enode) proc peerSummaryChange*(self: MailserverModel, peers: seq[string]) = - for p in peers: - debug "Peer summary", p for peer in self.nodes.keys: if not peers.contains(peer): self.nodes[peer] = MailserverStatus.Disconnected - warn "Peer disconnected", peer self.events.emit("peerDisconnected", MailserverArg(peer: peer)) # TODO: reconnect peer up to N times on 'peerDisconnected' @@ -117,15 +114,17 @@ proc peerSummaryChange*(self: MailserverModel, peers: seq[string]) = proc requestMessages*(self: MailserverModel) = debug "Requesting messages from", mailserver=self.selectedMailserver let generatedSymKey = status_chat.generateSymKeyFromPassword() - status_chat.requestMessages(toSeq(self.topics), generatedSymKey, self.selectedMailserver, 1000) + status_mailservers.requestMessages(toSeq(self.topics), generatedSymKey, self.selectedMailserver, 1000) proc autoConnect(self: MailserverModel) = let mailserversReply = parseJson(status_mailservers.ping(500))["result"] + var availableMailservers:seq[(string, int)] = @[] for reply in mailserversReply: if(reply["error"].kind != JNull): continue # The results with error are ignored availableMailservers.add((reply["address"].getStr, reply["rttMs"].getInt)) availableMailservers.sort(cmpMailserverReply) + # Picks a random mailserver amongs the ones with the lowest latency # The pool size is 1/4 of the mailservers were pinged successfully randomize() @@ -158,4 +157,3 @@ proc init*(self: MailserverModel) = #TODO: connect to current mailserver from the settings # or setup a random one: self.autoConnect() - diff --git a/ui/app/AppLayouts/Chat/components/PrivateChatPopup.qml b/ui/app/AppLayouts/Chat/components/PrivateChatPopup.qml index 42bd32664f..44b59694bb 100644 --- a/ui/app/AppLayouts/Chat/components/PrivateChatPopup.qml +++ b/ui/app/AppLayouts/Chat/components/PrivateChatPopup.qml @@ -18,7 +18,7 @@ ModalPopup { id: chatKeyBox height: 44 color: Theme.grey - anchors.top: separator.bottom + anchors.top: parent.top anchors.topMargin: 16 radius: 8 anchors.right: parent.right diff --git a/ui/shared/ModalPopup.qml b/ui/shared/ModalPopup.qml index 4f23bd73a2..a9631d5780 100644 --- a/ui/shared/ModalPopup.qml +++ b/ui/shared/ModalPopup.qml @@ -50,7 +50,7 @@ Popup { Image { id: closeModalImg - source: "../../../img/close.svg" + source: "./img/close.svg" anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter } diff --git a/ui/app/img/close.svg b/ui/shared/img/close.svg similarity index 100% rename from ui/app/img/close.svg rename to ui/shared/img/close.svg