refactor: code cleanup
This commit is contained in:
parent
2641986bbe
commit
dd0e9de324
|
@ -1,5 +1,5 @@
|
||||||
import NimQml
|
import NimQml
|
||||||
import json, eventemitter, chronicles
|
import eventemitter, chronicles
|
||||||
import ../../status/chat as chat_model
|
import ../../status/chat as chat_model
|
||||||
import ../../status/mailservers as mailserver_model
|
import ../../status/mailservers as mailserver_model
|
||||||
import ../../signals/types
|
import ../../signals/types
|
||||||
|
@ -29,11 +29,11 @@ proc delete*(self: ChatController) =
|
||||||
delete self.variant
|
delete self.variant
|
||||||
|
|
||||||
proc handleChatEvents(self: ChatController) =
|
proc handleChatEvents(self: ChatController) =
|
||||||
|
# Display already saved messages
|
||||||
self.status.events.on("messagesLoaded") do(e:Args):
|
self.status.events.on("messagesLoaded") do(e:Args):
|
||||||
for message in MsgsLoadedArgs(e).messages:
|
for message in MsgsLoadedArgs(e).messages:
|
||||||
self.view.pushMessage(message.chatId, message.toChatMessage())
|
self.view.pushMessage(message.chatId, message.toChatMessage())
|
||||||
|
|
||||||
|
|
||||||
self.status.events.on("messageSent") do(e: Args):
|
self.status.events.on("messageSent") do(e: Args):
|
||||||
var sentMessage = MsgArgs(e)
|
var sentMessage = MsgArgs(e)
|
||||||
var chatMessage = sentMessage.payload.toChatMessage()
|
var chatMessage = sentMessage.payload.toChatMessage()
|
||||||
|
@ -62,7 +62,6 @@ proc handleMailserverEvents(self: ChatController) =
|
||||||
self.status.events.on("mailserverAvailable") do(e:Args):
|
self.status.events.on("mailserverAvailable") do(e:Args):
|
||||||
self.status.mailservers.requestMessages()
|
self.status.mailservers.requestMessages()
|
||||||
|
|
||||||
|
|
||||||
proc init*(self: ChatController) =
|
proc init*(self: ChatController) =
|
||||||
self.handleMailserverEvents()
|
self.handleMailserverEvents()
|
||||||
self.handleChatEvents()
|
self.handleChatEvents()
|
||||||
|
@ -72,24 +71,20 @@ proc init*(self: ChatController) =
|
||||||
|
|
||||||
self.view.setActiveChannelByIndex(0)
|
self.view.setActiveChannelByIndex(0)
|
||||||
|
|
||||||
proc handleMessage(self: ChatController, data: Signal) =
|
proc handleMessage(self: ChatController, data: MessageSignal) =
|
||||||
var messageSignal = cast[MessageSignal](data)
|
for c in data.chats:
|
||||||
|
self.view.updateChat(c.toChatItem())
|
||||||
|
|
||||||
for c in messageSignal.chats:
|
for message in data.messages:
|
||||||
let channel = c.toChatItem()
|
self.view.pushMessage(message.localChatId, message.toChatMessage())
|
||||||
self.view.updateChat(channel)
|
|
||||||
|
|
||||||
for message in messageSignal.messages:
|
proc handleDiscoverySummary(self: ChatController, data: DiscoverySummarySignal) =
|
||||||
let chatMessage = message.toChatMessage()
|
## Handle mailserver peers being added and removed
|
||||||
self.view.pushMessage(message.localChatId, chatMessage)
|
self.status.mailservers.peerSummaryChange(data.enodes)
|
||||||
|
|
||||||
proc handleDiscoverySummary(self: ChatController, data: Signal) =
|
|
||||||
var discovery = DiscoverySummarySignal(data)
|
|
||||||
self.status.mailservers.peerSummaryChange(discovery.enodes)
|
|
||||||
|
|
||||||
method onSignal(self: ChatController, data: Signal) =
|
method onSignal(self: ChatController, data: Signal) =
|
||||||
case data.signalType:
|
case data.signalType:
|
||||||
of SignalType.Message: handleMessage(self, data)
|
of SignalType.Message: handleMessage(self, MessageSignal(data))
|
||||||
of SignalType.DiscoverySummary: handleDiscoverySummary(self, data)
|
of SignalType.DiscoverySummary: handleDiscoverySummary(self, DiscoverySummarySignal(data))
|
||||||
else:
|
else:
|
||||||
warn "Unhandled signal received", signalType = data.signalType
|
warn "Unhandled signal received", signalType = data.signalType
|
||||||
|
|
|
@ -32,7 +32,7 @@ QtObject:
|
||||||
result.setup()
|
result.setup()
|
||||||
|
|
||||||
proc getChatsList(self: ChatsView): QVariant {.slot.} =
|
proc getChatsList(self: ChatsView): QVariant {.slot.} =
|
||||||
return newQVariant(self.chats)
|
newQVariant(self.chats)
|
||||||
|
|
||||||
QtProperty[QVariant] chats:
|
QtProperty[QVariant] chats:
|
||||||
read = getChatsList
|
read = getChatsList
|
||||||
|
@ -53,7 +53,7 @@ QtObject:
|
||||||
self.activeChannelChanged()
|
self.activeChannelChanged()
|
||||||
|
|
||||||
proc getActiveChannelIdx(self: ChatsView): QVariant {.slot.} =
|
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:
|
QtProperty[QVariant] activeChannelIndex:
|
||||||
read = getActiveChannelIdx
|
read = getActiveChannelIdx
|
||||||
|
@ -65,7 +65,7 @@ QtObject:
|
||||||
self.activeChannelChanged()
|
self.activeChannelChanged()
|
||||||
|
|
||||||
proc getActiveChannel*(self: ChatsView): QVariant {.slot.} =
|
proc getActiveChannel*(self: ChatsView): QVariant {.slot.} =
|
||||||
result = newQVariant(self.activeChannel)
|
newQVariant(self.activeChannel)
|
||||||
|
|
||||||
QtProperty[QVariant] activeChannel:
|
QtProperty[QVariant] activeChannel:
|
||||||
read = getActiveChannel
|
read = getActiveChannel
|
||||||
|
|
|
@ -21,14 +21,17 @@ QtObject:
|
||||||
self.chatItem = chatItem
|
self.chatItem = chatItem
|
||||||
|
|
||||||
proc id*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.id
|
proc id*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.id
|
||||||
|
|
||||||
QtProperty[string] id:
|
QtProperty[string] id:
|
||||||
read = id
|
read = id
|
||||||
|
|
||||||
proc name*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.name
|
proc name*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.name
|
||||||
|
|
||||||
QtProperty[string] name:
|
QtProperty[string] name:
|
||||||
read = name
|
read = name
|
||||||
|
|
||||||
proc identicon*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.identicon
|
proc identicon*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.identicon
|
||||||
|
|
||||||
QtProperty[string] identicon:
|
QtProperty[string] identicon:
|
||||||
read = identicon
|
read = identicon
|
||||||
|
|
||||||
|
@ -37,5 +40,6 @@ QtObject:
|
||||||
result = self.chatItem.chatType.int
|
result = self.chatItem.chatType.int
|
||||||
else:
|
else:
|
||||||
result = 0
|
result = 0
|
||||||
|
|
||||||
QtProperty[int] chatType:
|
QtProperty[int] chatType:
|
||||||
read = chatType
|
read = chatType
|
||||||
|
|
|
@ -98,3 +98,4 @@ QtObject:
|
||||||
read = statusSignal
|
read = statusSignal
|
||||||
write = receiveSignal
|
write = receiveSignal
|
||||||
notify = signalReceived
|
notify = signalReceived
|
||||||
|
|
|
@ -1,36 +1,34 @@
|
||||||
import eventemitter, sets, json, strutils
|
import eventemitter, sets, json
|
||||||
import sequtils
|
import sequtils
|
||||||
import libstatus/utils
|
|
||||||
import libstatus/core as status_core
|
|
||||||
import libstatus/chat as status_chat
|
import libstatus/chat as status_chat
|
||||||
import libstatus/mailservers as status_mailservers
|
|
||||||
import chronicles
|
import chronicles
|
||||||
import ../signals/types
|
import ../signals/types
|
||||||
import chat/chat_item
|
import chat/chat_item
|
||||||
import chat/chat_message
|
import chat/chat_message
|
||||||
import tables
|
import tables
|
||||||
|
|
||||||
export chat_item
|
export chat_item
|
||||||
export chat_message
|
export chat_message
|
||||||
|
|
||||||
type MsgArgs* = ref object of Args
|
type
|
||||||
|
MsgArgs* = ref object of Args
|
||||||
message*: string
|
message*: string
|
||||||
chatId*: string
|
chatId*: string
|
||||||
payload*: JsonNode
|
payload*: JsonNode
|
||||||
|
|
||||||
type ChannelArgs* = ref object of Args
|
ChannelArgs* = ref object of Args
|
||||||
channel*: string
|
channel*: string
|
||||||
chatTypeInt*: ChatType
|
chatTypeInt*: ChatType
|
||||||
|
|
||||||
type ChatArgs* = ref object of Args
|
ChatArgs* = ref object of Args
|
||||||
chats*: seq[Chat]
|
chats*: seq[Chat]
|
||||||
|
|
||||||
type TopicArgs* = ref object of Args
|
TopicArgs* = ref object of Args
|
||||||
topics*: seq[string]
|
topics*: seq[string]
|
||||||
|
|
||||||
type MsgsLoadedArgs* = ref object of Args
|
MsgsLoadedArgs* = ref object of Args
|
||||||
messages*: seq[Message]
|
messages*: seq[Message]
|
||||||
|
|
||||||
type
|
|
||||||
ChatModel* = ref object
|
ChatModel* = ref object
|
||||||
events*: EventEmitter
|
events*: EventEmitter
|
||||||
channels*: HashSet[string]
|
channels*: HashSet[string]
|
||||||
|
@ -69,12 +67,9 @@ proc join*(self: ChatModel, chatId: string, chatType: ChatType) =
|
||||||
else:
|
else:
|
||||||
self.events.emit("mailserverTopics", TopicArgs(topics: topics));
|
self.events.emit("mailserverTopics", TopicArgs(topics: topics));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self.events.emit("channelJoined", ChannelArgs(channel: chatId, chatTypeInt: chatType))
|
self.events.emit("channelJoined", ChannelArgs(channel: chatId, chatTypeInt: chatType))
|
||||||
self.events.emit("activeChannelChanged", ChannelArgs(channel: self.getActiveChannel()))
|
self.events.emit("activeChannelChanged", ChannelArgs(channel: self.getActiveChannel()))
|
||||||
|
|
||||||
|
|
||||||
proc init*(self: ChatModel) =
|
proc init*(self: ChatModel) =
|
||||||
let chatList = status_chat.loadChats()
|
let chatList = status_chat.loadChats()
|
||||||
|
|
||||||
|
@ -103,7 +98,6 @@ proc init*(self: ChatModel) =
|
||||||
else:
|
else:
|
||||||
self.events.emit("mailserverTopics", TopicArgs(topics: topics));
|
self.events.emit("mailserverTopics", TopicArgs(topics: topics));
|
||||||
|
|
||||||
|
|
||||||
proc leave*(self: ChatModel, chatId: string) =
|
proc leave*(self: ChatModel, chatId: string) =
|
||||||
status_chat.removeFilters(chatId, self.filters[chatId])
|
status_chat.removeFilters(chatId, self.filters[chatId])
|
||||||
status_chat.deactivateChat(chatId)
|
status_chat.deactivateChat(chatId)
|
||||||
|
|
|
@ -73,7 +73,7 @@ proc loadChats*(): seq[Chat] =
|
||||||
|
|
||||||
proc chatMessages*(chatId: string): seq[Message] =
|
proc chatMessages*(chatId: string): seq[Message] =
|
||||||
result = @[]
|
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:
|
if rpcResult["messages"].kind != JNull:
|
||||||
for jsonMsg in rpcResult["messages"]:
|
for jsonMsg in rpcResult["messages"]:
|
||||||
result.add(jsonMsg.toMessage)
|
result.add(jsonMsg.toMessage)
|
||||||
|
@ -85,20 +85,6 @@ proc generateSymKeyFromPassword*(): string =
|
||||||
"status-offline-inbox"
|
"status-offline-inbox"
|
||||||
]))["result"]).strip(chars = {'"'})
|
]))["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 =
|
proc sendChatMessage*(chatId: string, msg: string): string =
|
||||||
callPrivateRPC("sendChatMessage".prefix, %* [
|
callPrivateRPC("sendChatMessage".prefix, %* [
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,7 +39,7 @@ proc addPeer*(peer: string) =
|
||||||
discard callPrivateRPC("admin_addPeer", %* [peer])
|
discard callPrivateRPC("admin_addPeer", %* [peer])
|
||||||
|
|
||||||
proc removePeer*(peer: string) =
|
proc removePeer*(peer: string) =
|
||||||
echo "TODO: removePeer"
|
discard callPrivateRPC("admin_removePeer", %* [peer])
|
||||||
|
|
||||||
proc markTrustedPeer*(peer: string) =
|
proc markTrustedPeer*(peer: string) =
|
||||||
discard callPrivateRPC("markTrustedPeer".prefix(false), %* [peer])
|
discard callPrivateRPC("markTrustedPeer".prefix(false), %* [peer])
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import core
|
import core
|
||||||
import json
|
import json
|
||||||
import utils
|
import utils
|
||||||
|
import times
|
||||||
|
|
||||||
proc getMailservers*(): array[0..8, (string, string)] =
|
proc getMailservers*(): array[0..8, (string, string)] =
|
||||||
result = [
|
result = [
|
||||||
|
@ -58,3 +59,17 @@ proc update*(peer: string) =
|
||||||
|
|
||||||
proc delete*(peer: string) =
|
proc delete*(peer: string) =
|
||||||
discard callPrivateRPC("mailservers_deleteMailserver".prefix, %* [[peer]])
|
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
|
||||||
|
}
|
||||||
|
])
|
|
@ -83,7 +83,7 @@ proc connect*(self: MailserverModel, enode: string) =
|
||||||
return
|
return
|
||||||
|
|
||||||
self.selectedMailserver = enode
|
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:
|
if self.nodes[enode] == MailserverStatus.Connected:
|
||||||
self.trustPeer(enode)
|
self.trustPeer(enode)
|
||||||
else:
|
else:
|
||||||
|
@ -94,12 +94,9 @@ proc connect*(self: MailserverModel, enode: string) =
|
||||||
status_mailservers.update(enode)
|
status_mailservers.update(enode)
|
||||||
|
|
||||||
proc peerSummaryChange*(self: MailserverModel, peers: seq[string]) =
|
proc peerSummaryChange*(self: MailserverModel, peers: seq[string]) =
|
||||||
for p in peers:
|
|
||||||
debug "Peer summary", p
|
|
||||||
for peer in self.nodes.keys:
|
for peer in self.nodes.keys:
|
||||||
if not peers.contains(peer):
|
if not peers.contains(peer):
|
||||||
self.nodes[peer] = MailserverStatus.Disconnected
|
self.nodes[peer] = MailserverStatus.Disconnected
|
||||||
warn "Peer disconnected", peer
|
|
||||||
self.events.emit("peerDisconnected", MailserverArg(peer: peer))
|
self.events.emit("peerDisconnected", MailserverArg(peer: peer))
|
||||||
# TODO: reconnect peer up to N times on 'peerDisconnected'
|
# TODO: reconnect peer up to N times on 'peerDisconnected'
|
||||||
|
|
||||||
|
@ -117,15 +114,17 @@ proc peerSummaryChange*(self: MailserverModel, peers: seq[string]) =
|
||||||
proc requestMessages*(self: MailserverModel) =
|
proc requestMessages*(self: MailserverModel) =
|
||||||
debug "Requesting messages from", mailserver=self.selectedMailserver
|
debug "Requesting messages from", mailserver=self.selectedMailserver
|
||||||
let generatedSymKey = status_chat.generateSymKeyFromPassword()
|
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) =
|
proc autoConnect(self: MailserverModel) =
|
||||||
let mailserversReply = parseJson(status_mailservers.ping(500))["result"]
|
let mailserversReply = parseJson(status_mailservers.ping(500))["result"]
|
||||||
|
|
||||||
var availableMailservers:seq[(string, int)] = @[]
|
var availableMailservers:seq[(string, int)] = @[]
|
||||||
for reply in mailserversReply:
|
for reply in mailserversReply:
|
||||||
if(reply["error"].kind != JNull): continue # The results with error are ignored
|
if(reply["error"].kind != JNull): continue # The results with error are ignored
|
||||||
availableMailservers.add((reply["address"].getStr, reply["rttMs"].getInt))
|
availableMailservers.add((reply["address"].getStr, reply["rttMs"].getInt))
|
||||||
availableMailservers.sort(cmpMailserverReply)
|
availableMailservers.sort(cmpMailserverReply)
|
||||||
|
|
||||||
# Picks a random mailserver amongs the ones with the lowest latency
|
# Picks a random mailserver amongs the ones with the lowest latency
|
||||||
# The pool size is 1/4 of the mailservers were pinged successfully
|
# The pool size is 1/4 of the mailservers were pinged successfully
|
||||||
randomize()
|
randomize()
|
||||||
|
@ -158,4 +157,3 @@ proc init*(self: MailserverModel) =
|
||||||
#TODO: connect to current mailserver from the settings
|
#TODO: connect to current mailserver from the settings
|
||||||
# or setup a random one:
|
# or setup a random one:
|
||||||
self.autoConnect()
|
self.autoConnect()
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ ModalPopup {
|
||||||
id: chatKeyBox
|
id: chatKeyBox
|
||||||
height: 44
|
height: 44
|
||||||
color: Theme.grey
|
color: Theme.grey
|
||||||
anchors.top: separator.bottom
|
anchors.top: parent.top
|
||||||
anchors.topMargin: 16
|
anchors.topMargin: 16
|
||||||
radius: 8
|
radius: 8
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
|
|
|
@ -50,7 +50,7 @@ Popup {
|
||||||
|
|
||||||
Image {
|
Image {
|
||||||
id: closeModalImg
|
id: closeModalImg
|
||||||
source: "../../../img/close.svg"
|
source: "./img/close.svg"
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 664 B After Width: | Height: | Size: 664 B |
Loading…
Reference in New Issue