refactor: removing mailserver controller and model
This commit is contained in:
parent
f36bee6337
commit
ad7f48d6ac
|
@ -165,8 +165,8 @@ proc newAppController*(statusFoundation: StatusFoundation): AppController =
|
||||||
result.providerService = provider_service.newService(result.dappPermissionsService, result.settingsService)
|
result.providerService = provider_service.newService(result.dappPermissionsService, result.settingsService)
|
||||||
result.savedAddressService = saved_address_service.newService(statusFoundation.events)
|
result.savedAddressService = saved_address_service.newService(statusFoundation.events)
|
||||||
result.devicesService = devices_service.newService(statusFoundation.events, result.settingsService)
|
result.devicesService = devices_service.newService(statusFoundation.events, result.settingsService)
|
||||||
result.mailserversService = mailservers_service.newService(statusFoundation.events, statusFoundation.marathon,
|
result.mailserversService = mailservers_service.newService(statusFoundation.events, statusFoundation.threadpool,
|
||||||
result.settingsService, result.nodeConfigurationService, statusFoundation.fleetConfiguration)
|
result.settingsService, result.nodeConfigurationService, statusFoundation.fleetConfiguration)
|
||||||
result.nodeService = node_service.newService(statusFoundation.events, statusFoundation.threadpool,
|
result.nodeService = node_service.newService(statusFoundation.events, statusFoundation.threadpool,
|
||||||
result.settingsService)
|
result.settingsService)
|
||||||
result.gifService = gif_service.newService(result.settingsService)
|
result.gifService = gif_service.newService(result.settingsService)
|
||||||
|
@ -326,6 +326,7 @@ proc load(self: AppController) =
|
||||||
self.communityService,
|
self.communityService,
|
||||||
self.messageService,
|
self.messageService,
|
||||||
self.gifService,
|
self.gifService,
|
||||||
|
self.mailserversService
|
||||||
)
|
)
|
||||||
|
|
||||||
proc userLoggedIn*(self: AppController) =
|
proc userLoggedIn*(self: AppController) =
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
import NimQml, chronicles, task_runner
|
import task_runner
|
||||||
import
|
import
|
||||||
eventemitter,
|
eventemitter,
|
||||||
./fleets/fleet_configuration,
|
./fleets/fleet_configuration,
|
||||||
./tasks/marathon,
|
./tasks/marathon,
|
||||||
./tasks/marathon/mailserver/controller,
|
|
||||||
./tasks/marathon/mailserver/worker,
|
|
||||||
./tasks/threadpool,
|
./tasks/threadpool,
|
||||||
./signals/signals_manager
|
./signals/signals_manager
|
||||||
|
|
||||||
|
@ -15,28 +13,19 @@ type StatusFoundation* = ref object
|
||||||
events*: EventEmitter
|
events*: EventEmitter
|
||||||
fleetConfiguration*: FleetConfiguration
|
fleetConfiguration*: FleetConfiguration
|
||||||
threadpool*: ThreadPool
|
threadpool*: ThreadPool
|
||||||
marathon*: Marathon
|
|
||||||
signalsManager*: SignalsManager
|
signalsManager*: SignalsManager
|
||||||
mailserverController*: MailserverController
|
|
||||||
mailserverWorker*: MailserverWorker
|
|
||||||
|
|
||||||
proc newStatusFoundation*(fleetConfig: string): StatusFoundation =
|
proc newStatusFoundation*(fleetConfig: string): StatusFoundation =
|
||||||
result = StatusFoundation()
|
result = StatusFoundation()
|
||||||
result.events = createEventEmitter()
|
result.events = createEventEmitter()
|
||||||
result.fleetConfiguration = newFleetConfiguration(fleetConfig)
|
result.fleetConfiguration = newFleetConfiguration(fleetConfig)
|
||||||
result.mailserverController = newMailserverController(result.events)
|
|
||||||
result.mailserverWorker = newMailserverWorker(cast[ByteAddress](result.mailserverController.vptr))
|
|
||||||
result.threadpool = newThreadPool()
|
result.threadpool = newThreadPool()
|
||||||
result.marathon = newMarathon(result.mailserverWorker)
|
|
||||||
result.signalsManager = newSignalsManager(result.events)
|
result.signalsManager = newSignalsManager(result.events)
|
||||||
|
|
||||||
proc delete*(self: StatusFoundation) =
|
proc delete*(self: StatusFoundation) =
|
||||||
self.threadpool.teardown()
|
self.threadpool.teardown()
|
||||||
self.marathon.teardown()
|
|
||||||
self.mailserverWorker.teardown()
|
|
||||||
self.mailserverController.delete()
|
|
||||||
self.fleetConfiguration.delete()
|
self.fleetConfiguration.delete()
|
||||||
self.signalsManager.delete()
|
self.signalsManager.delete()
|
||||||
|
|
||||||
proc onLoggedIn*(self: StatusFoundation) =
|
proc onLoggedIn*(self: StatusFoundation) =
|
||||||
self.marathon.onLoggedIn()
|
discard
|
||||||
|
|
|
@ -1,103 +0,0 @@
|
||||||
import NimQml, json_serialization, chronicles
|
|
||||||
|
|
||||||
import ../../../eventemitter
|
|
||||||
import ../../../fleets/fleet_configuration
|
|
||||||
import ../../../../../app_service/service/settings/service_interface as settings_service
|
|
||||||
import ../../../../../app_service/service/node_configuration/service_interface as node_config_service
|
|
||||||
|
|
||||||
import status/settings as status_settings
|
|
||||||
import status/mailservers as status_mailservers
|
|
||||||
|
|
||||||
import ../../common as task_runner_common
|
|
||||||
|
|
||||||
logScope:
|
|
||||||
topics = "mailserver controller"
|
|
||||||
|
|
||||||
const STATUS_MAILSERVER_PASS = "status-offline-inbox"
|
|
||||||
const STATUS_STORE_MESSAGES_TIMEOUT = 30
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## ##
|
|
||||||
## NOTE: MailserverController runs on the main thread ##
|
|
||||||
## ##
|
|
||||||
################################################################################
|
|
||||||
QtObject:
|
|
||||||
type MailserverController* = ref object of QObject
|
|
||||||
events: EventEmitter
|
|
||||||
|
|
||||||
proc newMailserverController*(events: EventEmitter): MailserverController =
|
|
||||||
new(result)
|
|
||||||
result.events = events
|
|
||||||
result.setup()
|
|
||||||
|
|
||||||
proc setup(self: MailserverController) =
|
|
||||||
self.QObject.setup
|
|
||||||
|
|
||||||
proc delete*(self: MailserverController) =
|
|
||||||
self.QObject.delete
|
|
||||||
|
|
||||||
# In case of mailserver task, we need to fetch data directly from the `status-go`, and that's why direct calls to
|
|
||||||
# `status-lib` are made here. If we use services here, the state remains the same as it was in the moment when certain
|
|
||||||
# service is passed to the mailserver thread.
|
|
||||||
proc getCurrentSettings(self: MailserverController): SettingsDto =
|
|
||||||
try:
|
|
||||||
let response = status_settings.getSettings()
|
|
||||||
let settings = response.result.toSettingsDto()
|
|
||||||
return settings
|
|
||||||
except Exception as e:
|
|
||||||
let errDesription = e.msg
|
|
||||||
error "error: ", methodName="mailserver-getCurrentSettings", errDesription
|
|
||||||
|
|
||||||
|
|
||||||
proc getFleet*(self: MailserverController): string =
|
|
||||||
let settings = self.getCurrentSettings()
|
|
||||||
var fleet = settings_service.DEFAULT_FLEET
|
|
||||||
if(settings.fleet.len > 0):
|
|
||||||
fleet = settings.fleet
|
|
||||||
return fleet
|
|
||||||
|
|
||||||
proc getPinnedMailserver*(self: MailserverController): string =
|
|
||||||
let settings = self.getCurrentSettings()
|
|
||||||
let fleet = self.getFleet()
|
|
||||||
|
|
||||||
if (fleet == $Fleet.Prod):
|
|
||||||
return settings.pinnedMailserver.ethProd
|
|
||||||
elif (fleet == $Fleet.Staging):
|
|
||||||
return settings.pinnedMailserver.ethStaging
|
|
||||||
elif (fleet == $Fleet.Test):
|
|
||||||
return settings.pinnedMailserver.ethTest
|
|
||||||
elif (fleet == $Fleet.WakuV2Prod):
|
|
||||||
return settings.pinnedMailserver.wakuv2Prod
|
|
||||||
elif (fleet == $Fleet.WakuV2Test):
|
|
||||||
return settings.pinnedMailserver.wakuv2Test
|
|
||||||
elif (fleet == $Fleet.GoWakuTest):
|
|
||||||
return settings.pinnedMailserver.goWakuTest
|
|
||||||
return ""
|
|
||||||
|
|
||||||
proc requestAllHistoricMessages*(self: MailserverController) =
|
|
||||||
try:
|
|
||||||
discard status_mailservers.requestAllHistoricMessages()
|
|
||||||
except Exception as e:
|
|
||||||
let errDesription = e.msg
|
|
||||||
error "error: ", methodName="mailserver-requestAllHistoricMessages", errDesription
|
|
||||||
|
|
||||||
proc syncChatFromSyncedFrom*(self: MailserverController, chatId: string) =
|
|
||||||
try:
|
|
||||||
discard status_mailservers.syncChatFromSyncedFrom(chatId)
|
|
||||||
except Exception as e:
|
|
||||||
let errDesription = e.msg
|
|
||||||
error "error: ", methodName="mailserver-syncChatFromSyncedFrom", errDesription
|
|
||||||
|
|
||||||
proc fillGaps*(self: MailserverController, chatId: string, messageIds: seq[string]) =
|
|
||||||
try:
|
|
||||||
discard status_mailservers.fillGaps(chatId, messageIds)
|
|
||||||
except Exception as e:
|
|
||||||
let errDesription = e.msg
|
|
||||||
error "error: ", methodName="mailserver-fillGaps", errDesription
|
|
||||||
|
|
||||||
proc disconnectActiveMailserver*(self: MailserverController) =
|
|
||||||
try:
|
|
||||||
discard status_mailservers.disconnectActiveMailserver()
|
|
||||||
except Exception as e:
|
|
||||||
let errDesription = e.msg
|
|
||||||
error "error: ", methodName="mailserver-disconnectActiveMailserver", errDesription
|
|
|
@ -1,45 +0,0 @@
|
||||||
import chronos, chronicles
|
|
||||||
import ../../../../../app_service/service/node_configuration/service_interface as node_config_service
|
|
||||||
import controller
|
|
||||||
|
|
||||||
logScope:
|
|
||||||
topics = "mailserver model"
|
|
||||||
|
|
||||||
type
|
|
||||||
MailserverModel* = ref object
|
|
||||||
mailserverController: MailserverController
|
|
||||||
|
|
||||||
proc newMailserverModel*(vptr: ByteAddress): MailserverModel =
|
|
||||||
result = MailserverModel()
|
|
||||||
result.mailserverController = cast[MailserverController](vptr)
|
|
||||||
|
|
||||||
proc disconnectActiveMailserver(self: MailserverModel) =
|
|
||||||
try:
|
|
||||||
warn "Disconnecting active mailserver due to error"
|
|
||||||
self.mailserverController.disconnectActiveMailserver()
|
|
||||||
except Exception as e:
|
|
||||||
error "error: ", errDescription=e.msg
|
|
||||||
|
|
||||||
proc requestMessages*(self: MailserverModel) =
|
|
||||||
try:
|
|
||||||
info "Requesting message history"
|
|
||||||
self.mailserverController.requestAllHistoricMessages()
|
|
||||||
except Exception as e:
|
|
||||||
error "error: ", errDescription=e.msg
|
|
||||||
self.disconnectActiveMailserver()
|
|
||||||
|
|
||||||
proc requestMoreMessages*(self: MailserverModel, chatId: string) =
|
|
||||||
try:
|
|
||||||
info "Requesting more messages for", chatId=chatId
|
|
||||||
self.mailserverController.syncChatFromSyncedFrom(chatId)
|
|
||||||
except Exception as e:
|
|
||||||
error "error: ", errDescription=e.msg
|
|
||||||
self.disconnectActiveMailserver()
|
|
||||||
|
|
||||||
proc fillGaps*(self: MailserverModel, chatId: string, messageIds: seq[string]) =
|
|
||||||
try:
|
|
||||||
info "Requesting fill gaps from", chatId=chatId
|
|
||||||
self.mailserverController.fillGaps(chatId, messageIds)
|
|
||||||
except Exception as e:
|
|
||||||
error "error: ", errDescription=e.msg
|
|
||||||
self.disconnectActiveMailserver()
|
|
|
@ -1,142 +0,0 @@
|
||||||
import # std libs
|
|
||||||
json, tables
|
|
||||||
|
|
||||||
import # vendor libs
|
|
||||||
chronicles, chronos, json_serialization, task_runner
|
|
||||||
|
|
||||||
import # status-desktop libs
|
|
||||||
../worker, ./model, ../../qt, ../../common as task_runner_common,
|
|
||||||
../common as methuselash_common
|
|
||||||
|
|
||||||
export
|
|
||||||
chronos, task_runner_common, json_serialization
|
|
||||||
|
|
||||||
logScope:
|
|
||||||
topics = "mailserver worker"
|
|
||||||
|
|
||||||
type
|
|
||||||
MailserverWorker* = ref object of MarathonWorker
|
|
||||||
|
|
||||||
# below are all custom marathon task arg definitions
|
|
||||||
IsActiveMailserverAvailableTaskArg* = ref object of MarathonTaskArg
|
|
||||||
GetActiveMailserverTaskArg* = ref object of MarathonTaskArg
|
|
||||||
RequestMessagesTaskArg* = ref object of MarathonTaskArg
|
|
||||||
chatId*: string
|
|
||||||
FillGapsTaskArg* = ref object of MarathonTaskArg
|
|
||||||
chatId*: string
|
|
||||||
messageIds*: seq[string]
|
|
||||||
AddMailserverTopicTaskArg* = ref object of MarathonTaskArg
|
|
||||||
PeerSummaryChangeTaskArg* = ref object of MarathonTaskArg
|
|
||||||
peers*: seq[string]
|
|
||||||
GetMailserverTopicsByChatIdTaskArg* = ref object of MarathonTaskArg
|
|
||||||
chatId*: string
|
|
||||||
fetchRange*: int
|
|
||||||
GetMailserverTopicsByChatIdsTaskArg* = ref object of MarathonTaskArg
|
|
||||||
chatIds*: seq[string]
|
|
||||||
fetchRange*: int
|
|
||||||
|
|
||||||
|
|
||||||
const
|
|
||||||
WORKER_NAME = "mailserver"
|
|
||||||
|
|
||||||
# forward declarations
|
|
||||||
proc workerThread(arg: WorkerThreadArg) {.thread.}
|
|
||||||
|
|
||||||
proc newMailserverWorker*(vptr: ByteAddress): MailserverWorker =
|
|
||||||
new(result)
|
|
||||||
result.chanRecvFromWorker = newAsyncChannel[ThreadSafeString](-1)
|
|
||||||
result.chanSendToWorker = newAsyncChannel[ThreadSafeString](-1)
|
|
||||||
result.vptr = vptr
|
|
||||||
|
|
||||||
method name*(self: MailserverWorker): string = WORKER_NAME
|
|
||||||
|
|
||||||
method init*(self: MailserverWorker) =
|
|
||||||
self.chanRecvFromWorker.open()
|
|
||||||
self.chanSendToWorker.open()
|
|
||||||
let arg = WorkerThreadArg(
|
|
||||||
chanSendToMain: self.chanRecvFromWorker,
|
|
||||||
chanRecvFromMain: self.chanSendToWorker,
|
|
||||||
vptr: self.vptr
|
|
||||||
)
|
|
||||||
createThread(self.thread, workerThread, arg)
|
|
||||||
# block until we receive "ready"
|
|
||||||
discard $(self.chanRecvFromWorker.recvSync())
|
|
||||||
|
|
||||||
method teardown*(self: MailserverWorker) =
|
|
||||||
self.chanSendToWorker.sendSync("shutdown".safe)
|
|
||||||
self.chanRecvFromWorker.close()
|
|
||||||
self.chanSendToWorker.close()
|
|
||||||
trace "waiting for the control thread to stop"
|
|
||||||
joinThread(self.thread)
|
|
||||||
|
|
||||||
method onLoggedIn*(self: MailserverWorker) =
|
|
||||||
self.chanSendToWorker.sendSync("loggedIn".safe)
|
|
||||||
|
|
||||||
proc processMessage(mailserverModel: MailserverModel, received: string) =
|
|
||||||
let
|
|
||||||
parsed = parseJson(received)
|
|
||||||
messageType = parsed{"$type"}.getStr
|
|
||||||
methodName = parsed{"method"}.getStr()
|
|
||||||
trace "initiating mailserver task", methodName=methodName, messageType=messageType
|
|
||||||
|
|
||||||
case methodName
|
|
||||||
of "requestAllHistoricMessages":
|
|
||||||
let taskArg = decode[RequestMessagesTaskArg](received)
|
|
||||||
mailserverModel.requestMessages()
|
|
||||||
taskArg.finish("") # TODO:
|
|
||||||
|
|
||||||
of "requestMessages":
|
|
||||||
let taskArg = decode[RequestMessagesTaskArg](received)
|
|
||||||
mailserverModel.requestMessages()
|
|
||||||
|
|
||||||
of "requestMoreMessages":
|
|
||||||
let taskArg = decode[RequestMessagesTaskArg](received)
|
|
||||||
mailserverModel.requestMoreMessages(taskArg.chatId)
|
|
||||||
|
|
||||||
of "fillGaps":
|
|
||||||
let taskArg = decode[FillGapsTaskArg](received)
|
|
||||||
mailserverModel.fillGaps(taskArg.chatId, taskArg.messageIds)
|
|
||||||
|
|
||||||
else:
|
|
||||||
error "unknown message", message=received
|
|
||||||
|
|
||||||
proc worker(arg: WorkerThreadArg) {.async, gcsafe, nimcall.} =
|
|
||||||
let
|
|
||||||
chanSendToMain = arg.chanSendToMain
|
|
||||||
chanRecvFromMain = arg.chanRecvFromMain
|
|
||||||
chanSendToMain.open()
|
|
||||||
chanRecvFromMain.open()
|
|
||||||
|
|
||||||
trace "sending 'ready' to main thread"
|
|
||||||
await chanSendToMain.send("ready".safe)
|
|
||||||
let mailserverModel = newMailserverModel(arg.vptr)
|
|
||||||
|
|
||||||
var unprocessedMsgs: seq[string] = @[]
|
|
||||||
# wait for "loggedIn" before initing mailserverModel and continuing
|
|
||||||
while true:
|
|
||||||
let received = $(await chanRecvFromMain.recv())
|
|
||||||
if received == "loggedIn":
|
|
||||||
break
|
|
||||||
elif received == "shutdown":
|
|
||||||
trace "received 'shutdown'"
|
|
||||||
trace "stopping worker"
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
unprocessedMsgs.add received
|
|
||||||
|
|
||||||
for msg in unprocessedMsgs.items:
|
|
||||||
mailserverModel.processMessage(msg)
|
|
||||||
|
|
||||||
while true:
|
|
||||||
trace "waiting for message"
|
|
||||||
let received = $(await chanRecvFromMain.recv())
|
|
||||||
case received
|
|
||||||
of "shutdown":
|
|
||||||
trace "received 'shutdown'"
|
|
||||||
trace "stopping worker"
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
mailserverModel.processMessage(received)
|
|
||||||
|
|
||||||
proc workerThread(arg: WorkerThreadArg) =
|
|
||||||
waitFor worker(arg)
|
|
|
@ -6,6 +6,7 @@ import ../../../../../../app_service/service/contacts/service as contact_service
|
||||||
import ../../../../../../app_service/service/community/service as community_service
|
import ../../../../../../app_service/service/community/service as community_service
|
||||||
import ../../../../../../app_service/service/chat/service as chat_service
|
import ../../../../../../app_service/service/chat/service as chat_service
|
||||||
import ../../../../../../app_service/service/message/service as message_service
|
import ../../../../../../app_service/service/message/service as message_service
|
||||||
|
import ../../../../../../app_service/service/mailservers/service as mailservers_service
|
||||||
import ../../../../../../app_service/service/eth/utils as eth_utils
|
import ../../../../../../app_service/service/eth/utils as eth_utils
|
||||||
import ../../../../../core/signals/types
|
import ../../../../../core/signals/types
|
||||||
import ../../../../../core/eventemitter
|
import ../../../../../core/eventemitter
|
||||||
|
@ -28,10 +29,11 @@ type
|
||||||
communityService: community_service.Service
|
communityService: community_service.Service
|
||||||
chatService: chat_service.Service
|
chatService: chat_service.Service
|
||||||
messageService: message_service.Service
|
messageService: message_service.Service
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
|
|
||||||
proc newController*(delegate: io_interface.AccessInterface, events: EventEmitter, sectionId: string, chatId: string,
|
proc newController*(delegate: io_interface.AccessInterface, events: EventEmitter, sectionId: string, chatId: string,
|
||||||
belongsToCommunity: bool, contactService: contact_service.Service, communityService: community_service.Service,
|
belongsToCommunity: bool, contactService: contact_service.Service, communityService: community_service.Service,
|
||||||
chatService: chat_service.Service, messageService: message_service.Service):
|
chatService: chat_service.Service, messageService: message_service.Service, mailserversService: mailservers_service.Service):
|
||||||
Controller =
|
Controller =
|
||||||
result = Controller()
|
result = Controller()
|
||||||
result.delegate = delegate
|
result.delegate = delegate
|
||||||
|
@ -44,6 +46,7 @@ proc newController*(delegate: io_interface.AccessInterface, events: EventEmitter
|
||||||
result.communityService = communityService
|
result.communityService = communityService
|
||||||
result.chatService = chatService
|
result.chatService = chatService
|
||||||
result.messageService = messageService
|
result.messageService = messageService
|
||||||
|
result.mailserversService = mailserversService
|
||||||
|
|
||||||
method delete*(self: Controller) =
|
method delete*(self: Controller) =
|
||||||
discard
|
discard
|
||||||
|
@ -224,4 +227,10 @@ method increaseLoadingMessagesPerPageFactor*(self: Controller) =
|
||||||
self.loadingMessagesPerPageFactor = self.loadingMessagesPerPageFactor + 1
|
self.loadingMessagesPerPageFactor = self.loadingMessagesPerPageFactor + 1
|
||||||
|
|
||||||
method resetLoadingMessagesPerPageFactor*(self: Controller) =
|
method resetLoadingMessagesPerPageFactor*(self: Controller) =
|
||||||
self.loadingMessagesPerPageFactor = 1
|
self.loadingMessagesPerPageFactor = 1
|
||||||
|
|
||||||
|
method requestMoreMessages*(self: Controller) =
|
||||||
|
self.mailserversService.requestMoreMessages(self.chatId)
|
||||||
|
|
||||||
|
method fillGaps*(self: Controller, messageId: string) =
|
||||||
|
self.mailserversService.fillGaps(self.chatId, messageId)
|
||||||
|
|
|
@ -88,4 +88,10 @@ method increaseLoadingMessagesPerPageFactor*(self: AccessInterface) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method resetLoadingMessagesPerPageFactor*(self: AccessInterface) {.base.} =
|
method resetLoadingMessagesPerPageFactor*(self: AccessInterface) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
|
method requestMoreMessages*(self: AccessInterface) {.base.} =
|
||||||
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
|
method fillGaps*(self: AccessInterface, messageId: string) {.base.} =
|
||||||
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
|
@ -11,6 +11,7 @@ import ../../../../../../app_service/service/contacts/service as contact_service
|
||||||
import ../../../../../../app_service/service/community/service as community_service
|
import ../../../../../../app_service/service/community/service as community_service
|
||||||
import ../../../../../../app_service/service/chat/service as chat_service
|
import ../../../../../../app_service/service/chat/service as chat_service
|
||||||
import ../../../../../../app_service/service/message/service as message_service
|
import ../../../../../../app_service/service/message/service as message_service
|
||||||
|
import ../../../../../../app_service/service/mailservers/service as mailservers_service
|
||||||
|
|
||||||
export io_interface
|
export io_interface
|
||||||
|
|
||||||
|
@ -18,6 +19,7 @@ logScope:
|
||||||
topics = "messages-module"
|
topics = "messages-module"
|
||||||
|
|
||||||
const CHAT_IDENTIFIER_MESSAGE_ID = "chat-identifier-message-id"
|
const CHAT_IDENTIFIER_MESSAGE_ID = "chat-identifier-message-id"
|
||||||
|
const FETCH_MORE_MESSAGES_MESSAGE_ID = "fetch-more_messages-message-id"
|
||||||
|
|
||||||
type
|
type
|
||||||
Module* = ref object of io_interface.AccessInterface
|
Module* = ref object of io_interface.AccessInterface
|
||||||
|
@ -29,18 +31,19 @@ type
|
||||||
|
|
||||||
proc newModule*(delegate: delegate_interface.AccessInterface, events: EventEmitter, sectionId: string, chatId: string,
|
proc newModule*(delegate: delegate_interface.AccessInterface, events: EventEmitter, sectionId: string, chatId: string,
|
||||||
belongsToCommunity: bool, contactService: contact_service.Service, communityService: community_service.Service,
|
belongsToCommunity: bool, contactService: contact_service.Service, communityService: community_service.Service,
|
||||||
chatService: chat_service.Service, messageService: message_service.Service):
|
chatService: chat_service.Service, messageService: message_service.Service, mailserversService: mailservers_service.Service):
|
||||||
Module =
|
Module =
|
||||||
result = Module()
|
result = Module()
|
||||||
result.delegate = delegate
|
result.delegate = delegate
|
||||||
result.view = view.newView(result)
|
result.view = view.newView(result)
|
||||||
result.viewVariant = newQVariant(result.view)
|
result.viewVariant = newQVariant(result.view)
|
||||||
result.controller = controller.newController(result, events, sectionId, chatId, belongsToCommunity, contactService,
|
result.controller = controller.newController(result, events, sectionId, chatId, belongsToCommunity, contactService,
|
||||||
communityService, chatService, messageService)
|
communityService, chatService, messageService, mailserversService)
|
||||||
result.moduleLoaded = false
|
result.moduleLoaded = false
|
||||||
|
|
||||||
# Forward declaration
|
# Forward declaration
|
||||||
proc createChatIdentifierItem(self: Module): Item
|
proc createChatIdentifierItem(self: Module): Item
|
||||||
|
proc createFetchMoreMessagesItem(self: Module): Item
|
||||||
|
|
||||||
method delete*(self: Module) =
|
method delete*(self: Module) =
|
||||||
self.view.delete
|
self.view.delete
|
||||||
|
@ -55,7 +58,7 @@ method isLoaded*(self: Module): bool =
|
||||||
return self.moduleLoaded
|
return self.moduleLoaded
|
||||||
|
|
||||||
method viewDidLoad*(self: Module) =
|
method viewDidLoad*(self: Module) =
|
||||||
# The first message in the model must be always ChatIdentifier message.
|
self.view.model().appendItem(self.createFetchMoreMessagesItem())
|
||||||
self.view.model().appendItem(self.createChatIdentifierItem())
|
self.view.model().appendItem(self.createChatIdentifierItem())
|
||||||
|
|
||||||
self.moduleLoaded = true
|
self.moduleLoaded = true
|
||||||
|
@ -64,6 +67,31 @@ method viewDidLoad*(self: Module) =
|
||||||
method getModuleAsVariant*(self: Module): QVariant =
|
method getModuleAsVariant*(self: Module): QVariant =
|
||||||
return self.viewVariant
|
return self.viewVariant
|
||||||
|
|
||||||
|
proc createFetchMoreMessagesItem(self: Module): Item =
|
||||||
|
let chatDto = self.controller.getChatDetails()
|
||||||
|
let isIdenticon = false
|
||||||
|
result = initItem(
|
||||||
|
FETCH_MORE_MESSAGES_MESSAGE_ID,
|
||||||
|
responseToMessageWithId = "",
|
||||||
|
senderId = chatDto.id,
|
||||||
|
senderDisplayName = "",
|
||||||
|
senderLocalName = "",
|
||||||
|
senderIcon = "",
|
||||||
|
isIdenticon,
|
||||||
|
amISender = false,
|
||||||
|
outgoingStatus = "",
|
||||||
|
text = "",
|
||||||
|
image = "",
|
||||||
|
messageContainsMentions = false,
|
||||||
|
seen = true,
|
||||||
|
timestamp = 0,
|
||||||
|
ContentType.FetchMoreMessagesButton,
|
||||||
|
messageType = -1,
|
||||||
|
sticker = "",
|
||||||
|
stickerPack = -1,
|
||||||
|
@[],
|
||||||
|
)
|
||||||
|
|
||||||
proc createChatIdentifierItem(self: Module): Item =
|
proc createChatIdentifierItem(self: Module): Item =
|
||||||
let chatDto = self.controller.getChatDetails()
|
let chatDto = self.controller.getChatDetails()
|
||||||
var chatName = chatDto.name
|
var chatName = chatDto.name
|
||||||
|
@ -160,9 +188,9 @@ method newMessagesLoaded*(self: Module, messages: seq[MessageDto], reactions: se
|
||||||
# messages are sorted from the most recent to the least recent one
|
# messages are sorted from the most recent to the least recent one
|
||||||
viewItems.add(item)
|
viewItems.add(item)
|
||||||
|
|
||||||
# ChatIdentifier message will be always the first message (the oldest one)
|
viewItems.add(self.createFetchMoreMessagesItem())
|
||||||
viewItems.add(self.createChatIdentifierItem())
|
viewItems.add(self.createChatIdentifierItem())
|
||||||
# Delete the old ChatIdentifier message first
|
self.view.model().removeItem(FETCH_MORE_MESSAGES_MESSAGE_ID)
|
||||||
self.view.model().removeItem(CHAT_IDENTIFIER_MESSAGE_ID)
|
self.view.model().removeItem(CHAT_IDENTIFIER_MESSAGE_ID)
|
||||||
# Add new loaded messages
|
# Add new loaded messages
|
||||||
self.view.model().appendItems(viewItems)
|
self.view.model().appendItems(viewItems)
|
||||||
|
@ -348,4 +376,10 @@ method switchToMessage*(self: Module, messageId: string) =
|
||||||
method scrollToMessage*(self: Module, messageId: string) =
|
method scrollToMessage*(self: Module, messageId: string) =
|
||||||
self.controller.setSearchedMessageId(messageId)
|
self.controller.setSearchedMessageId(messageId)
|
||||||
if(not self.checkIfMessageLoadedAndScrollToItIfItIs()):
|
if(not self.checkIfMessageLoadedAndScrollToItIfItIs()):
|
||||||
self.loadMoreMessages()
|
self.loadMoreMessages()
|
||||||
|
|
||||||
|
method requestMoreMessages*(self: Module) =
|
||||||
|
self.controller.requestMoreMessages()
|
||||||
|
|
||||||
|
method fillGaps*(self: Module, messageId: string) =
|
||||||
|
self.controller.fillGaps(messageId)
|
||||||
|
|
|
@ -39,4 +39,4 @@ method setLoadingHistoryMessagesInProgress*(self: AccessInterface, isLoading: bo
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method scrollToMessage*(self: AccessInterface, messageId: string) {.base.} =
|
method scrollToMessage*(self: AccessInterface, messageId: string) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
|
@ -38,4 +38,10 @@ method getLinkPreviewData*(self: AccessInterface, link: string, uuid: string): s
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method onPreviewDataLoaded*(self: AccessInterface, previewData: string) {.base.} =
|
method onPreviewDataLoaded*(self: AccessInterface, previewData: string) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
|
method requestMoreMessages*(self: AccessInterface) {.base.} =
|
||||||
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
|
method fillGaps*(self: AccessInterface, messageId: string) {.base.} =
|
||||||
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
|
@ -141,4 +141,11 @@ QtObject:
|
||||||
|
|
||||||
proc scrollMessagesUp(self: View) {.signal.}
|
proc scrollMessagesUp(self: View) {.signal.}
|
||||||
proc emitScrollMessagesUpSignal*(self: View) =
|
proc emitScrollMessagesUpSignal*(self: View) =
|
||||||
self.scrollMessagesUp()
|
self.scrollMessagesUp()
|
||||||
|
|
||||||
|
proc requestMoreMessages(self: View) {.slot.} =
|
||||||
|
self.delegate.requestMoreMessages()
|
||||||
|
|
||||||
|
proc fillGaps(self: View, messageId: string) {.slot.} =
|
||||||
|
self.delegate.fillGaps(messageId)
|
||||||
|
|
|
@ -18,6 +18,7 @@ import ../../../../../app_service/service/chat/service as chat_service
|
||||||
import ../../../../../app_service/service/community/service as community_service
|
import ../../../../../app_service/service/community/service as community_service
|
||||||
import ../../../../../app_service/service/gif/service as gif_service
|
import ../../../../../app_service/service/gif/service as gif_service
|
||||||
import ../../../../../app_service/service/message/service as message_service
|
import ../../../../../app_service/service/message/service as message_service
|
||||||
|
import ../../../../../app_service/service/mailservers/service as mailservers_service
|
||||||
|
|
||||||
export io_interface
|
export io_interface
|
||||||
|
|
||||||
|
@ -38,7 +39,8 @@ type
|
||||||
proc newModule*(delegate: delegate_interface.AccessInterface, events: EventEmitter, sectionId: string, chatId: string,
|
proc newModule*(delegate: delegate_interface.AccessInterface, events: EventEmitter, sectionId: string, chatId: string,
|
||||||
belongsToCommunity: bool, isUsersListAvailable: bool, settingsService: settings_service.ServiceInterface,
|
belongsToCommunity: bool, isUsersListAvailable: bool, settingsService: settings_service.ServiceInterface,
|
||||||
contactService: contact_service.Service, chatService: chat_service.Service,
|
contactService: contact_service.Service, chatService: chat_service.Service,
|
||||||
communityService: community_service.Service, messageService: message_service.Service, gifService: gif_service.Service):
|
communityService: community_service.Service, messageService: message_service.Service, gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service):
|
||||||
Module =
|
Module =
|
||||||
result = Module()
|
result = Module()
|
||||||
result.delegate = delegate
|
result.delegate = delegate
|
||||||
|
@ -50,7 +52,7 @@ proc newModule*(delegate: delegate_interface.AccessInterface, events: EventEmitt
|
||||||
|
|
||||||
result.inputAreaModule = input_area_module.newModule(result, sectionId, chatId, belongsToCommunity, chatService, communityService, gifService)
|
result.inputAreaModule = input_area_module.newModule(result, sectionId, chatId, belongsToCommunity, chatService, communityService, gifService)
|
||||||
result.messagesModule = messages_module.newModule(result, events, sectionId, chatId, belongsToCommunity,
|
result.messagesModule = messages_module.newModule(result, events, sectionId, chatId, belongsToCommunity,
|
||||||
contactService, communityService, chatService, messageService)
|
contactService, communityService, chatService, messageService, mailserversService)
|
||||||
result.usersModule = users_module.newModule(result, events, sectionId, chatId, belongsToCommunity, isUsersListAvailable,
|
result.usersModule = users_module.newModule(result, events, sectionId, chatId, belongsToCommunity, isUsersListAvailable,
|
||||||
contactService, communityService, messageService)
|
contactService, communityService, messageService)
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import ../../../../app_service/service/chat/service as chat_service
|
||||||
import ../../../../app_service/service/community/service as community_service
|
import ../../../../app_service/service/community/service as community_service
|
||||||
import ../../../../app_service/service/message/service as message_service
|
import ../../../../app_service/service/message/service as message_service
|
||||||
import ../../../../app_service/service/gif/service as gif_service
|
import ../../../../app_service/service/gif/service as gif_service
|
||||||
|
import ../../../../app_service/service/mailservers/service as mailservers_service
|
||||||
|
|
||||||
import ../../../core/eventemitter
|
import ../../../core/eventemitter
|
||||||
|
|
||||||
|
@ -28,11 +29,13 @@ type
|
||||||
communityService: community_service.Service
|
communityService: community_service.Service
|
||||||
messageService: message_service.Service
|
messageService: message_service.Service
|
||||||
gifService: gif_service.Service
|
gifService: gif_service.Service
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
|
|
||||||
proc newController*(delegate: io_interface.AccessInterface, sectionId: string, isCommunity: bool, events: EventEmitter,
|
proc newController*(delegate: io_interface.AccessInterface, sectionId: string, isCommunity: bool, events: EventEmitter,
|
||||||
settingsService: settings_service.ServiceInterface, contactService: contact_service.Service,
|
settingsService: settings_service.ServiceInterface, contactService: contact_service.Service,
|
||||||
chatService: chat_service.Service, communityService: community_service.Service,
|
chatService: chat_service.Service, communityService: community_service.Service,
|
||||||
messageService: message_service.Service, gifService: gif_service.Service): Controller =
|
messageService: message_service.Service, gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service): Controller =
|
||||||
result = Controller()
|
result = Controller()
|
||||||
result.delegate = delegate
|
result.delegate = delegate
|
||||||
result.sectionId = sectionId
|
result.sectionId = sectionId
|
||||||
|
@ -44,6 +47,7 @@ proc newController*(delegate: io_interface.AccessInterface, sectionId: string, i
|
||||||
result.communityService = communityService
|
result.communityService = communityService
|
||||||
result.messageService = messageService
|
result.messageService = messageService
|
||||||
result.gifService = gifService
|
result.gifService = gifService
|
||||||
|
result.mailserversService = mailserversService
|
||||||
|
|
||||||
method delete*(self: Controller) =
|
method delete*(self: Controller) =
|
||||||
discard
|
discard
|
||||||
|
@ -98,7 +102,8 @@ method init*(self: Controller) =
|
||||||
self.chatService,
|
self.chatService,
|
||||||
self.communityService,
|
self.communityService,
|
||||||
self.messageService,
|
self.messageService,
|
||||||
self.gifService
|
self.gifService,
|
||||||
|
self.mailserversService
|
||||||
)
|
)
|
||||||
|
|
||||||
self.events.on(SIGNAL_COMMUNITY_CHANNEL_DELETED) do(e:Args):
|
self.events.on(SIGNAL_COMMUNITY_CHANNEL_DELETED) do(e:Args):
|
||||||
|
@ -191,13 +196,13 @@ method createPublicChat*(self: Controller, chatId: string) =
|
||||||
let response = self.chatService.createPublicChat(chatId)
|
let response = self.chatService.createPublicChat(chatId)
|
||||||
if(response.success):
|
if(response.success):
|
||||||
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
||||||
self.communityService, self.messageService, self.gifService)
|
self.communityService, self.messageService, self.gifService, self.mailserversService)
|
||||||
|
|
||||||
method createOneToOneChat*(self: Controller, chatId: string, ensName: string) =
|
method createOneToOneChat*(self: Controller, chatId: string, ensName: string) =
|
||||||
let response = self.chatService.createOneToOneChat(chatId, ensName)
|
let response = self.chatService.createOneToOneChat(chatId, ensName)
|
||||||
if(response.success):
|
if(response.success):
|
||||||
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
||||||
self.communityService, self.messageService, self.gifService)
|
self.communityService, self.messageService, self.gifService, self.mailserversService)
|
||||||
|
|
||||||
method leaveChat*(self: Controller, chatId: string) =
|
method leaveChat*(self: Controller, chatId: string) =
|
||||||
self.chatService.leaveChat(chatId)
|
self.chatService.leaveChat(chatId)
|
||||||
|
@ -255,7 +260,7 @@ method createGroupChat*(self: Controller, groupName: string, pubKeys: seq[string
|
||||||
let response = self.chatService.createGroupChat(groupName, pubKeys)
|
let response = self.chatService.createGroupChat(groupName, pubKeys)
|
||||||
if(response.success):
|
if(response.success):
|
||||||
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
||||||
self.communityService, self.messageService, self.gifService)
|
self.communityService, self.messageService, self.gifService, self.mailserversService)
|
||||||
|
|
||||||
method joinGroup*(self: Controller) =
|
method joinGroup*(self: Controller) =
|
||||||
self.chatService.confirmJoiningGroup(self.getActiveChatId())
|
self.chatService.confirmJoiningGroup(self.getActiveChatId())
|
||||||
|
@ -264,7 +269,7 @@ method joinGroupChatFromInvitation*(self: Controller, groupName: string, chatId:
|
||||||
let response = self.chatService.createGroupChatFromInvitation(groupName, chatId, adminPK)
|
let response = self.chatService.createGroupChatFromInvitation(groupName, chatId, adminPK)
|
||||||
if(response.success):
|
if(response.success):
|
||||||
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
self.delegate.addNewChat(response.chatDto, false, self.events, self.settingsService, self.contactService, self.chatService,
|
||||||
self.communityService, self.messageService, self.gifService)
|
self.communityService, self.messageService, self.gifService, self.mailserversService)
|
||||||
|
|
||||||
method acceptRequestToJoinCommunity*(self: Controller, requestId: string) =
|
method acceptRequestToJoinCommunity*(self: Controller, requestId: string) =
|
||||||
self.communityService.acceptRequestToJoinCommunity(self.sectionId, requestId)
|
self.communityService.acceptRequestToJoinCommunity(self.sectionId, requestId)
|
||||||
|
|
|
@ -14,6 +14,7 @@ import ../../../../app_service/service/contacts/service as contact_service
|
||||||
import ../../../../app_service/service/chat/service as chat_service
|
import ../../../../app_service/service/chat/service as chat_service
|
||||||
import ../../../../app_service/service/community/service as community_service
|
import ../../../../app_service/service/community/service as community_service
|
||||||
import ../../../../app_service/service/message/service as message_service
|
import ../../../../app_service/service/message/service as message_service
|
||||||
|
import ../../../../app_service/service/mailservers/service as mailservers_service
|
||||||
import ../../../../app_service/service/gif/service as gif_service
|
import ../../../../app_service/service/gif/service as gif_service
|
||||||
|
|
||||||
export io_interface
|
export io_interface
|
||||||
|
@ -42,11 +43,12 @@ proc newModule*(
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service,
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
): Module =
|
): Module =
|
||||||
result = Module()
|
result = Module()
|
||||||
result.delegate = delegate
|
result.delegate = delegate
|
||||||
result.controller = controller.newController(result, sectionId, isCommunity, events, settingsService, contactService,
|
result.controller = controller.newController(result, sectionId, isCommunity, events, settingsService, contactService,
|
||||||
chatService, communityService, messageService, gifService)
|
chatService, communityService, messageService, gifService, mailserversService)
|
||||||
result.view = view.newView(result)
|
result.view = view.newView(result)
|
||||||
result.viewVariant = newQVariant(result.view)
|
result.viewVariant = newQVariant(result.view)
|
||||||
result.moduleLoaded = false
|
result.moduleLoaded = false
|
||||||
|
@ -76,10 +78,11 @@ proc addSubmodule(self: Module, chatId: string, belongToCommunity: bool, isUsers
|
||||||
chatService: chat_service.Service,
|
chatService: chat_service.Service,
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service) =
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) =
|
||||||
self.chatContentModules[chatId] = chat_content_module.newModule(self, events, self.controller.getMySectionId(), chatId,
|
self.chatContentModules[chatId] = chat_content_module.newModule(self, events, self.controller.getMySectionId(), chatId,
|
||||||
belongToCommunity, isUsersListAvailable, settingsService, contactService, chatService, communityService,
|
belongToCommunity, isUsersListAvailable, settingsService, contactService, chatService, communityService,
|
||||||
messageService, gifService)
|
messageService, gifService, mailserversService)
|
||||||
|
|
||||||
proc removeSubmodule(self: Module, chatId: string) =
|
proc removeSubmodule(self: Module, chatId: string) =
|
||||||
if(not self.chatContentModules.contains(chatId)):
|
if(not self.chatContentModules.contains(chatId)):
|
||||||
|
@ -92,7 +95,8 @@ proc buildChatUI(self: Module, events: EventEmitter,
|
||||||
chatService: chat_service.Service,
|
chatService: chat_service.Service,
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service) =
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) =
|
||||||
let types = @[ChatType.OneToOne, ChatType.Public, ChatType.PrivateGroupChat]
|
let types = @[ChatType.OneToOne, ChatType.Public, ChatType.PrivateGroupChat]
|
||||||
let chats = self.controller.getChatDetailsForChatTypes(types)
|
let chats = self.controller.getChatDetailsForChatTypes(types)
|
||||||
|
|
||||||
|
@ -114,7 +118,7 @@ proc buildChatUI(self: Module, events: EventEmitter,
|
||||||
hasNotification, notificationsCount, c.muted, active = false, c.position, c.categoryId)
|
hasNotification, notificationsCount, c.muted, active = false, c.position, c.categoryId)
|
||||||
self.view.chatsModel().appendItem(item)
|
self.view.chatsModel().appendItem(item)
|
||||||
self.addSubmodule(c.id, false, isUsersListAvailable, events, settingsService, contactService, chatService,
|
self.addSubmodule(c.id, false, isUsersListAvailable, events, settingsService, contactService, chatService,
|
||||||
communityService, messageService, gifService)
|
communityService, messageService, gifService, mailserversService)
|
||||||
|
|
||||||
# make the first Public chat active when load the app
|
# make the first Public chat active when load the app
|
||||||
if(selectedItemId.len == 0 and c.chatType == ChatType.Public):
|
if(selectedItemId.len == 0 and c.chatType == ChatType.Public):
|
||||||
|
@ -128,7 +132,8 @@ proc buildCommunityUI(self: Module, events: EventEmitter,
|
||||||
chatService: chat_service.Service,
|
chatService: chat_service.Service,
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service) =
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) =
|
||||||
var selectedItemId = ""
|
var selectedItemId = ""
|
||||||
var selectedSubItemId = ""
|
var selectedSubItemId = ""
|
||||||
let communities = self.controller.getJoinedCommunities()
|
let communities = self.controller.getJoinedCommunities()
|
||||||
|
@ -149,7 +154,7 @@ proc buildCommunityUI(self: Module, events: EventEmitter,
|
||||||
chatDto.muted, active = false, c.position, c.categoryId)
|
chatDto.muted, active = false, c.position, c.categoryId)
|
||||||
self.view.chatsModel().appendItem(channelItem)
|
self.view.chatsModel().appendItem(channelItem)
|
||||||
self.addSubmodule(chatDto.id, true, true, events, settingsService, contactService, chatService, communityService,
|
self.addSubmodule(chatDto.id, true, true, events, settingsService, contactService, chatService, communityService,
|
||||||
messageService, gifService)
|
messageService, gifService, mailserversService)
|
||||||
|
|
||||||
# make the first channel which doesn't belong to any category active when load the app
|
# make the first channel which doesn't belong to any category active when load the app
|
||||||
if(selectedItemId.len == 0):
|
if(selectedItemId.len == 0):
|
||||||
|
@ -179,7 +184,7 @@ proc buildCommunityUI(self: Module, events: EventEmitter,
|
||||||
false, c.position)
|
false, c.position)
|
||||||
categoryChannels.add(channelItem)
|
categoryChannels.add(channelItem)
|
||||||
self.addSubmodule(chatDto.id, true, true, events, settingsService, contactService, chatService, communityService,
|
self.addSubmodule(chatDto.id, true, true, events, settingsService, contactService, chatService, communityService,
|
||||||
messageService, gifService)
|
messageService, gifService, mailserversService)
|
||||||
|
|
||||||
# in case there is no channels beyond categories,
|
# in case there is no channels beyond categories,
|
||||||
# make the first channel of the first category active when load the app
|
# make the first channel of the first category active when load the app
|
||||||
|
@ -237,14 +242,15 @@ method load*(self: Module, events: EventEmitter,
|
||||||
chatService: chat_service.Service,
|
chatService: chat_service.Service,
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service) =
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) =
|
||||||
self.controller.init()
|
self.controller.init()
|
||||||
self.view.load()
|
self.view.load()
|
||||||
|
|
||||||
if(self.controller.isCommunity()):
|
if(self.controller.isCommunity()):
|
||||||
self.buildCommunityUI(events, settingsService, contactService, chatService, communityService, messageService, gifService)
|
self.buildCommunityUI(events, settingsService, contactService, chatService, communityService, messageService, gifService, mailserversService)
|
||||||
else:
|
else:
|
||||||
self.buildChatUI(events, settingsService, contactService, chatService, communityService, messageService, gifService)
|
self.buildChatUI(events, settingsService, contactService, chatService, communityService, messageService, gifService, mailserversService)
|
||||||
self.initContactRequestsModel() # we do this only in case of chat section (not in case of communities)
|
self.initContactRequestsModel() # we do this only in case of chat section (not in case of communities)
|
||||||
|
|
||||||
for cModule in self.chatContentModules.values:
|
for cModule in self.chatContentModules.values:
|
||||||
|
@ -352,7 +358,8 @@ method addNewChat*(
|
||||||
chatService: chat_service.Service,
|
chatService: chat_service.Service,
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service) =
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) =
|
||||||
let hasNotification = chatDto.unviewedMessagesCount > 0 or chatDto.unviewedMentionsCount > 0
|
let hasNotification = chatDto.unviewedMessagesCount > 0 or chatDto.unviewedMentionsCount > 0
|
||||||
let notificationsCount = chatDto.unviewedMentionsCount
|
let notificationsCount = chatDto.unviewedMentionsCount
|
||||||
var chatName = chatDto.name
|
var chatName = chatDto.name
|
||||||
|
@ -373,7 +380,7 @@ method addNewChat*(
|
||||||
chatDto.chatType.int, amIChatAdmin, hasNotification, notificationsCount, chatDto.muted,
|
chatDto.chatType.int, amIChatAdmin, hasNotification, notificationsCount, chatDto.muted,
|
||||||
active = false, position = 0, chatDto.categoryId)
|
active = false, position = 0, chatDto.categoryId)
|
||||||
self.addSubmodule(chatDto.id, belongsToCommunity, isUsersListAvailable, events, settingsService, contactService, chatService,
|
self.addSubmodule(chatDto.id, belongsToCommunity, isUsersListAvailable, events, settingsService, contactService, chatService,
|
||||||
communityService, messageService, gifService)
|
communityService, messageService, gifService, mailserversService)
|
||||||
self.chatContentModules[chatDto.id].load()
|
self.chatContentModules[chatDto.id].load()
|
||||||
self.view.chatsModel().appendItem(item)
|
self.view.chatsModel().appendItem(item)
|
||||||
# make new added chat active one
|
# make new added chat active one
|
||||||
|
@ -384,7 +391,7 @@ method addNewChat*(
|
||||||
chatDto.description, chatDto.chatType.int, amIChatAdmin, hasNotification, notificationsCount, chatDto.muted,
|
chatDto.description, chatDto.chatType.int, amIChatAdmin, hasNotification, notificationsCount, chatDto.muted,
|
||||||
false, chatDto.position)
|
false, chatDto.position)
|
||||||
self.addSubmodule(chatDto.id, belongsToCommunity, isUsersListAvailable, events, settingsService, contactService, chatService,
|
self.addSubmodule(chatDto.id, belongsToCommunity, isUsersListAvailable, events, settingsService, contactService, chatService,
|
||||||
communityService, messageService, gifService)
|
communityService, messageService, gifService, mailserversService)
|
||||||
self.chatContentModules[chatDto.id].load()
|
self.chatContentModules[chatDto.id].load()
|
||||||
categoryItem.appendSubItem(channelItem)
|
categoryItem.appendSubItem(channelItem)
|
||||||
self.setActiveItemSubItem(categoryItem.id, channelItem.id)
|
self.setActiveItemSubItem(categoryItem.id, channelItem.id)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import ../../../../../app_service/service/chat/service as chat_service
|
||||||
import ../../../../../app_service/service/community/service as community_service
|
import ../../../../../app_service/service/community/service as community_service
|
||||||
import ../../../../../app_service/service/message/service as message_service
|
import ../../../../../app_service/service/message/service as message_service
|
||||||
import ../../../../../app_service/service/gif/service as gif_service
|
import ../../../../../app_service/service/gif/service as gif_service
|
||||||
|
import ../../../../../app_service/service/mailservers/service as mailservers_service
|
||||||
|
|
||||||
import ../../../../core/eventemitter
|
import ../../../../core/eventemitter
|
||||||
|
|
||||||
|
@ -18,7 +19,8 @@ method load*(self: AccessInterface, events: EventEmitter,
|
||||||
chatService: chat_service.Service,
|
chatService: chat_service.Service,
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service) {.base.} =
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method isLoaded*(self: AccessInterface): bool {.base.} =
|
method isLoaded*(self: AccessInterface): bool {.base.} =
|
||||||
|
|
|
@ -7,7 +7,8 @@ method makeChatWithIdActive*(self: AccessInterface, chatId: string) {.base.} =
|
||||||
method addNewChat*(self: AccessInterface, chatDto: ChatDto, belongsToCommunity: bool, events: EventEmitter,
|
method addNewChat*(self: AccessInterface, chatDto: ChatDto, belongsToCommunity: bool, events: EventEmitter,
|
||||||
settingsService: settings_service.ServiceInterface, contactService: contact_service.Service,
|
settingsService: settings_service.ServiceInterface, contactService: contact_service.Service,
|
||||||
chatService: chat_service.Service, communityService: community_service.Service,
|
chatService: chat_service.Service, communityService: community_service.Service,
|
||||||
messageService: message_service.Service, gifService: gif_service.Service) {.base.} =
|
messageService: message_service.Service, gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method onNewMessagesReceived*(self: AccessInterface, chatId: string, unviewedMessagesCount: int,
|
method onNewMessagesReceived*(self: AccessInterface, chatId: string, unviewedMessagesCount: int,
|
||||||
|
|
|
@ -181,7 +181,6 @@ QtObject:
|
||||||
proc joinGroupChatFromInvitation*(self: View, groupName: string, chatId: string, adminPK: string) {.slot.} =
|
proc joinGroupChatFromInvitation*(self: View, groupName: string, chatId: string, adminPK: string) {.slot.} =
|
||||||
self.delegate.joinGroupChatFromInvitation(groupName, chatId, adminPK)
|
self.delegate.joinGroupChatFromInvitation(groupName, chatId, adminPK)
|
||||||
|
|
||||||
|
|
||||||
proc acceptRequestToJoinCommunity*(self: View, requestId: string) {.slot.} =
|
proc acceptRequestToJoinCommunity*(self: View, requestId: string) {.slot.} =
|
||||||
self.delegate.acceptRequestToJoinCommunity(requestId)
|
self.delegate.acceptRequestToJoinCommunity(requestId)
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import ../../../app_service/service/community/service as community_service
|
||||||
import ../../../app_service/service/contacts/service as contacts_service
|
import ../../../app_service/service/contacts/service as contacts_service
|
||||||
import ../../../app_service/service/message/service as message_service
|
import ../../../app_service/service/message/service as message_service
|
||||||
import ../../../app_service/service/gif/service as gif_service
|
import ../../../app_service/service/gif/service as gif_service
|
||||||
|
import ../../../app_service/service/mailservers/service as mailservers_service
|
||||||
import ../../../app_service/service/privacy/service as privacy_service
|
import ../../../app_service/service/privacy/service as privacy_service
|
||||||
|
|
||||||
export controller_interface
|
export controller_interface
|
||||||
|
@ -32,6 +33,7 @@ type
|
||||||
contactsService: contacts_service.Service
|
contactsService: contacts_service.Service
|
||||||
gifService: gif_service.Service
|
gifService: gif_service.Service
|
||||||
privacyService: privacy_service.Service
|
privacyService: privacy_service.Service
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
activeSectionId: string
|
activeSectionId: string
|
||||||
|
|
||||||
proc newController*(delegate: io_interface.AccessInterface,
|
proc newController*(delegate: io_interface.AccessInterface,
|
||||||
|
@ -45,6 +47,7 @@ proc newController*(delegate: io_interface.AccessInterface,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service,
|
gifService: gif_service.Service,
|
||||||
privacyService: privacy_service.Service,
|
privacyService: privacy_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
):
|
):
|
||||||
Controller =
|
Controller =
|
||||||
result = Controller()
|
result = Controller()
|
||||||
|
@ -59,6 +62,7 @@ proc newController*(delegate: io_interface.AccessInterface,
|
||||||
result.messageService = messageService
|
result.messageService = messageService
|
||||||
result.gifService = gifService
|
result.gifService = gifService
|
||||||
result.privacyService = privacyService
|
result.privacyService = privacyService
|
||||||
|
result.mailserversService = mailserversService
|
||||||
|
|
||||||
method delete*(self: Controller) =
|
method delete*(self: Controller) =
|
||||||
discard
|
discard
|
||||||
|
@ -95,6 +99,7 @@ method init*(self: Controller) =
|
||||||
self.communityService,
|
self.communityService,
|
||||||
self.messageService,
|
self.messageService,
|
||||||
self.gifService,
|
self.gifService,
|
||||||
|
self.mailserversService
|
||||||
)
|
)
|
||||||
|
|
||||||
self.events.on(TOGGLE_SECTION) do(e:Args):
|
self.events.on(TOGGLE_SECTION) do(e:Args):
|
||||||
|
@ -112,6 +117,7 @@ method init*(self: Controller) =
|
||||||
self.communityService,
|
self.communityService,
|
||||||
self.messageService,
|
self.messageService,
|
||||||
self.gifService,
|
self.gifService,
|
||||||
|
self.mailserversService
|
||||||
)
|
)
|
||||||
|
|
||||||
self.events.on(SIGNAL_COMMUNITY_LEFT) do(e:Args):
|
self.events.on(SIGNAL_COMMUNITY_LEFT) do(e:Args):
|
||||||
|
|
|
@ -118,12 +118,13 @@ proc newModule*[T](
|
||||||
messageService,
|
messageService,
|
||||||
gifService,
|
gifService,
|
||||||
privacyService,
|
privacyService,
|
||||||
|
mailserversService
|
||||||
)
|
)
|
||||||
result.moduleLoaded = false
|
result.moduleLoaded = false
|
||||||
|
|
||||||
# Submodules
|
# Submodules
|
||||||
result.chatSectionModule = chat_section_module.newModule(result, events, conf.CHAT_SECTION_ID, false, settingsService,
|
result.chatSectionModule = chat_section_module.newModule(result, events, conf.CHAT_SECTION_ID, false, settingsService,
|
||||||
contactsService, chatService, communityService, messageService, gifService)
|
contactsService, chatService, communityService, messageService, gifService, mailserversService)
|
||||||
result.communitySectionsModule = initOrderedTable[string, chat_section_module.AccessInterface]()
|
result.communitySectionsModule = initOrderedTable[string, chat_section_module.AccessInterface]()
|
||||||
result.walletSectionModule = wallet_section_module.newModule[Module[T]](
|
result.walletSectionModule = wallet_section_module.newModule[Module[T]](
|
||||||
result, events, tokenService,
|
result, events, tokenService,
|
||||||
|
@ -206,6 +207,7 @@ method load*[T](
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service,
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
) =
|
) =
|
||||||
singletonInstance.engine.setRootContextProperty("mainModule", self.viewVariant)
|
singletonInstance.engine.setRootContextProperty("mainModule", self.viewVariant)
|
||||||
self.controller.init()
|
self.controller.init()
|
||||||
|
@ -226,6 +228,7 @@ method load*[T](
|
||||||
communityService,
|
communityService,
|
||||||
messageService,
|
messageService,
|
||||||
gifService,
|
gifService,
|
||||||
|
mailserversService
|
||||||
)
|
)
|
||||||
|
|
||||||
var activeSection: SectionItem
|
var activeSection: SectionItem
|
||||||
|
@ -334,9 +337,9 @@ method load*[T](
|
||||||
activeSection = profileSettingsSectionItem
|
activeSection = profileSettingsSectionItem
|
||||||
|
|
||||||
# Load all sections
|
# Load all sections
|
||||||
self.chatSectionModule.load(events, settingsService, contactsService, chatService, communityService, messageService, gifService)
|
self.chatSectionModule.load(events, settingsService, contactsService, chatService, communityService, messageService, gifService, mailserversService)
|
||||||
for cModule in self.communitySectionsModule.values:
|
for cModule in self.communitySectionsModule.values:
|
||||||
cModule.load(events, settingsService, contactsService, chatService, communityService, messageService, gifService)
|
cModule.load(events, settingsService, contactsService, chatService, communityService, messageService, gifService, mailserversService)
|
||||||
self.walletSectionModule.load()
|
self.walletSectionModule.load()
|
||||||
# self.walletV2SectionModule.load()
|
# self.walletV2SectionModule.load()
|
||||||
self.browserSectionModule.load()
|
self.browserSectionModule.load()
|
||||||
|
@ -522,6 +525,7 @@ method communityJoined*[T](
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service,
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
) =
|
) =
|
||||||
var firstCommunityJoined = false
|
var firstCommunityJoined = false
|
||||||
if (self.communitySectionsModule.len == 0):
|
if (self.communitySectionsModule.len == 0):
|
||||||
|
@ -537,8 +541,9 @@ method communityJoined*[T](
|
||||||
communityService,
|
communityService,
|
||||||
messageService,
|
messageService,
|
||||||
gifService,
|
gifService,
|
||||||
|
mailserversService
|
||||||
)
|
)
|
||||||
self.communitySectionsModule[community.id].load(events, settingsService, contactsService, chatService, communityService, messageService, gifService)
|
self.communitySectionsModule[community.id].load(events, settingsService, contactsService, chatService, communityService, messageService, gifService, mailserversService)
|
||||||
|
|
||||||
let communitySectionItem = self.createCommunityItem(community)
|
let communitySectionItem = self.createCommunityItem(community)
|
||||||
if (firstCommunityJoined):
|
if (firstCommunityJoined):
|
||||||
|
|
|
@ -4,6 +4,7 @@ import ../../../../app_service/service/chat/service as chat_service
|
||||||
import ../../../../app_service/service/community/service as community_service
|
import ../../../../app_service/service/community/service as community_service
|
||||||
import ../../../../app_service/service/message/service as message_service
|
import ../../../../app_service/service/message/service as message_service
|
||||||
import ../../../../app_service/service/gif/service as gif_service
|
import ../../../../app_service/service/gif/service as gif_service
|
||||||
|
import ../../../../app_service/service/mailservers/service as mailservers_service
|
||||||
|
|
||||||
import ../../../core/eventemitter
|
import ../../../core/eventemitter
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ method load*(
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service,
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service
|
||||||
)
|
)
|
||||||
{.base.} =
|
{.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
|
@ -21,7 +21,8 @@ method communityJoined*(self: AccessInterface, community: CommunityDto, events:
|
||||||
chatService: chat_service.Service,
|
chatService: chat_service.Service,
|
||||||
communityService: community_service.Service,
|
communityService: community_service.Service,
|
||||||
messageService: message_service.Service,
|
messageService: message_service.Service,
|
||||||
gifService: gif_service.Service) {.base.} =
|
gifService: gif_service.Service,
|
||||||
|
mailserversService: mailservers_service.Service) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method communityEdited*(self: AccessInterface, community: CommunityDto) {.base.} =
|
method communityEdited*(self: AccessInterface, community: CommunityDto) {.base.} =
|
||||||
|
|
|
@ -4,7 +4,7 @@ import ./dto/mailserver as mailserver_dto
|
||||||
import ../../../app/core/signals/types
|
import ../../../app/core/signals/types
|
||||||
import ../../../app/core/fleets/fleet_configuration
|
import ../../../app/core/fleets/fleet_configuration
|
||||||
import ../../../app/core/[main]
|
import ../../../app/core/[main]
|
||||||
import ../../../app/core/tasks/marathon/mailserver/worker
|
import ../../../app/core/tasks/[qt, threadpool]
|
||||||
import ../settings/service_interface as settings_service
|
import ../settings/service_interface as settings_service
|
||||||
import ../node_configuration/service_interface as node_configuration_service
|
import ../node_configuration/service_interface as node_configuration_service
|
||||||
import status/mailservers as status_mailservers
|
import status/mailservers as status_mailservers
|
||||||
|
@ -16,14 +16,53 @@ type
|
||||||
ActiveMailserverChangedArgs* = ref object of Args
|
ActiveMailserverChangedArgs* = ref object of Args
|
||||||
nodeAddress*: string
|
nodeAddress*: string
|
||||||
|
|
||||||
|
MailserverAvailableArgs* = ref object of Args
|
||||||
|
|
||||||
|
RequestMessagesTaskArg = ref object of QObjectTaskArg
|
||||||
|
|
||||||
|
RequestMoreMessagesTaskArg = ref object of QObjectTaskArg
|
||||||
|
chatId*: string
|
||||||
|
|
||||||
|
FillGapsTaskArg* = ref object of QObjectTaskArg
|
||||||
|
chatId*: string
|
||||||
|
messageIds*: seq[string]
|
||||||
|
|
||||||
# Signals which may be emitted by this service:
|
# Signals which may be emitted by this service:
|
||||||
const SIGNAL_ACTIVE_MAILSERVER_CHANGED* = "activeMailserverChanged"
|
const SIGNAL_ACTIVE_MAILSERVER_CHANGED* = "activeMailserverChanged"
|
||||||
|
const SIGNAL_MAILSERVER_AVAILABLE* = "mailserverAvailable"
|
||||||
|
|
||||||
|
const requestMessagesTask: Task = proc(argEncoded: string) {.gcsafe, nimcall.} =
|
||||||
|
let arg = decode[RequestMessagesTaskArg](argEncoded)
|
||||||
|
try:
|
||||||
|
info "Requesting message history"
|
||||||
|
discard status_mailservers.requestAllHistoricMessages()
|
||||||
|
except Exception as e:
|
||||||
|
warn "Disconnecting active mailserver due to error", errDescription=e.msg
|
||||||
|
discard status_mailservers.disconnectActiveMailserver()
|
||||||
|
|
||||||
|
const requestMoreMessagesTask: Task = proc(argEncoded: string) {.gcsafe, nimcall.} =
|
||||||
|
let arg = decode[RequestMoreMessagesTaskArg](argEncoded)
|
||||||
|
try:
|
||||||
|
info "Requesting additional message history for chat", chatId=arg.chatId
|
||||||
|
discard status_mailservers.syncChatFromSyncedFrom(arg.chatId)
|
||||||
|
except Exception as e:
|
||||||
|
warn "Disconnecting active mailserver due to error", errDescription=e.msg
|
||||||
|
discard status_mailservers.disconnectActiveMailserver()
|
||||||
|
|
||||||
|
const fillGapsTask: Task = proc(argEncoded: string) {.gcsafe, nimcall.} =
|
||||||
|
let arg = decode[FillGapsTaskArg](argEncoded)
|
||||||
|
try:
|
||||||
|
info "Requesting fill gaps", chatId=arg.chatId, messageIds=arg.messageIds
|
||||||
|
discard status_mailservers.fillGaps(arg.chatId, arg.messageIds)
|
||||||
|
except Exception as e:
|
||||||
|
warn "Disconnecting active mailserver due to error", errDescription=e.msg
|
||||||
|
discard status_mailservers.disconnectActiveMailserver()
|
||||||
|
|
||||||
QtObject:
|
QtObject:
|
||||||
type Service* = ref object of QObject
|
type Service* = ref object of QObject
|
||||||
mailservers: seq[tuple[name: string, nodeAddress: string]]
|
mailservers: seq[tuple[name: string, nodeAddress: string]]
|
||||||
events: EventEmitter
|
events: EventEmitter
|
||||||
marathon: Marathon
|
threadpool: ThreadPool
|
||||||
settingsService: settings_service.ServiceInterface
|
settingsService: settings_service.ServiceInterface
|
||||||
nodeConfigurationService: node_configuration_service.ServiceInterface
|
nodeConfigurationService: node_configuration_service.ServiceInterface
|
||||||
fleetConfiguration: FleetConfiguration
|
fleetConfiguration: FleetConfiguration
|
||||||
|
@ -36,13 +75,14 @@ QtObject:
|
||||||
proc delete*(self: Service) =
|
proc delete*(self: Service) =
|
||||||
self.QObject.delete
|
self.QObject.delete
|
||||||
|
|
||||||
proc newService*(events: EventEmitter, marathon: Marathon, settingsService: settings_service.ServiceInterface,
|
proc newService*(events: EventEmitter, threadpool: ThreadPool,
|
||||||
|
settingsService: settings_service.ServiceInterface,
|
||||||
nodeConfigurationService: node_configuration_service.ServiceInterface,
|
nodeConfigurationService: node_configuration_service.ServiceInterface,
|
||||||
fleetConfiguration: FleetConfiguration): Service =
|
fleetConfiguration: FleetConfiguration): Service =
|
||||||
new(result, delete)
|
new(result, delete)
|
||||||
result.QObject.setup
|
result.QObject.setup
|
||||||
result.events = events
|
result.events = events
|
||||||
result.marathon = marathon
|
result.threadpool = threadpool
|
||||||
result.settingsService = settingsService
|
result.settingsService = settingsService
|
||||||
result.nodeConfigurationService = nodeConfigurationService
|
result.nodeConfigurationService = nodeConfigurationService
|
||||||
result.fleetConfiguration = fleetConfiguration
|
result.fleetConfiguration = fleetConfiguration
|
||||||
|
@ -52,6 +92,30 @@ QtObject:
|
||||||
self.initMailservers()
|
self.initMailservers()
|
||||||
self.fetchMailservers()
|
self.fetchMailservers()
|
||||||
|
|
||||||
|
proc requestMessages(self: Service) =
|
||||||
|
let arg = RequestMessagesTaskArg(
|
||||||
|
tptr: cast[ByteAddress](requestMessagesTask),
|
||||||
|
vptr: cast[ByteAddress](self.vptr)
|
||||||
|
)
|
||||||
|
self.threadpool.start(arg)
|
||||||
|
|
||||||
|
proc requestMoreMessages*(self: Service, chatId: string) =
|
||||||
|
let arg = RequestMoreMessagesTaskArg(
|
||||||
|
tptr: cast[ByteAddress](requestMoreMessagesTask),
|
||||||
|
vptr: cast[ByteAddress](self.vptr),
|
||||||
|
chatId: chatId
|
||||||
|
)
|
||||||
|
self.threadpool.start(arg)
|
||||||
|
|
||||||
|
proc fillGaps*(self: Service, chatId: string, messageId: string) =
|
||||||
|
let arg = FillGapsTaskArg(
|
||||||
|
tptr: cast[ByteAddress](fillGapsTask),
|
||||||
|
vptr: cast[ByteAddress](self.vptr),
|
||||||
|
chatId: chatId,
|
||||||
|
messageIds: @[messageId]
|
||||||
|
)
|
||||||
|
self.threadpool.start(arg)
|
||||||
|
|
||||||
proc doConnect(self: Service) =
|
proc doConnect(self: Service) =
|
||||||
self.events.on(SignalType.MailserverChanged.event) do(e: Args):
|
self.events.on(SignalType.MailserverChanged.event) do(e: Args):
|
||||||
let receivedData = MailserverChangedSignal(e)
|
let receivedData = MailserverChangedSignal(e)
|
||||||
|
@ -60,6 +124,12 @@ QtObject:
|
||||||
let data = ActiveMailserverChangedArgs(nodeAddress: address)
|
let data = ActiveMailserverChangedArgs(nodeAddress: address)
|
||||||
self.events.emit(SIGNAL_ACTIVE_MAILSERVER_CHANGED, data)
|
self.events.emit(SIGNAL_ACTIVE_MAILSERVER_CHANGED, data)
|
||||||
|
|
||||||
|
self.events.on(SignalType.MailserverAvailable.event) do(e: Args):
|
||||||
|
info "mailserver available"
|
||||||
|
self.requestMessages()
|
||||||
|
let data = MailserverAvailableArgs()
|
||||||
|
self.events.emit(SIGNAL_MAILSERVER_AVAILABLE, data)
|
||||||
|
|
||||||
self.events.on(SignalType.HistoryRequestStarted.event) do(e: Args):
|
self.events.on(SignalType.HistoryRequestStarted.event) do(e: Args):
|
||||||
let h = HistoryRequestStartedSignal(e)
|
let h = HistoryRequestStartedSignal(e)
|
||||||
info "history request started", requestId=h.requestId, numBatches=h.numBatches
|
info "history request started", requestId=h.requestId, numBatches=h.numBatches
|
||||||
|
@ -134,4 +204,4 @@ QtObject:
|
||||||
|
|
||||||
proc onActiveMailserverResult*(self: Service, response: string) {.slot.} =
|
proc onActiveMailserverResult*(self: Service, response: string) {.slot.} =
|
||||||
let fleet = self.settingsService.getFleet()
|
let fleet = self.settingsService.getFleet()
|
||||||
discard self.settingsService.pinMailserver(response, fleet)
|
discard self.settingsService.pinMailserver(response, fleet)
|
||||||
|
|
|
@ -88,7 +88,6 @@ proc mainProc() =
|
||||||
let isProductionQVariant = newQVariant(if defined(production): true else: false)
|
let isProductionQVariant = newQVariant(if defined(production): true else: false)
|
||||||
let isExperimentalQVariant = newQVariant(isExperimental)
|
let isExperimentalQVariant = newQVariant(isExperimental)
|
||||||
let signalsManagerQVariant = newQVariant(statusFoundation.signalsManager)
|
let signalsManagerQVariant = newQVariant(statusFoundation.signalsManager)
|
||||||
let mailserverControllerQVariant = newQVariant(statusFoundation.mailserverController)
|
|
||||||
|
|
||||||
QResource.registerResource(app.applicationDirPath & resourcesPath)
|
QResource.registerResource(app.applicationDirPath & resourcesPath)
|
||||||
# Register events objects
|
# Register events objects
|
||||||
|
@ -107,7 +106,6 @@ proc mainProc() =
|
||||||
singletonInstance.engine.setRootContextProperty("singleInstance", newQVariant(singleInstance))
|
singletonInstance.engine.setRootContextProperty("singleInstance", newQVariant(singleInstance))
|
||||||
singletonInstance.engine.setRootContextProperty("isExperimental", isExperimentalQVariant)
|
singletonInstance.engine.setRootContextProperty("isExperimental", isExperimentalQVariant)
|
||||||
singletonInstance.engine.setRootContextProperty("signals", signalsManagerQVariant)
|
singletonInstance.engine.setRootContextProperty("signals", signalsManagerQVariant)
|
||||||
singletonInstance.engine.setRootContextProperty("mailserver", mailserverControllerQVariant)
|
|
||||||
singletonInstance.engine.setRootContextProperty("production", isProductionQVariant)
|
singletonInstance.engine.setRootContextProperty("production", isProductionQVariant)
|
||||||
|
|
||||||
app.installEventFilter(dockShowAppEvent)
|
app.installEventFilter(dockShowAppEvent)
|
||||||
|
@ -119,7 +117,6 @@ proc mainProc() =
|
||||||
isProductionQVariant.delete()
|
isProductionQVariant.delete()
|
||||||
isExperimentalQVariant.delete()
|
isExperimentalQVariant.delete()
|
||||||
signalsManagerQVariant.delete()
|
signalsManagerQVariant.delete()
|
||||||
mailserverControllerQVariant.delete()
|
|
||||||
networkAccessFactory.delete()
|
networkAccessFactory.delete()
|
||||||
dockShowAppEvent.delete()
|
dockShowAppEvent.delete()
|
||||||
osThemeEvent.delete()
|
osThemeEvent.delete()
|
||||||
|
|
|
@ -188,10 +188,21 @@ QtObject {
|
||||||
return msg
|
return msg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getLinkPreviewData(url, uuid) {
|
function getLinkPreviewData(url, uuid) {
|
||||||
if(!messageModule)
|
if(!messageModule)
|
||||||
return
|
return
|
||||||
return messageModule.getLinkPreviewData(url, uuid)
|
return messageModule.getLinkPreviewData(url, uuid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function requestMoreMessages() {
|
||||||
|
if(!messageModule)
|
||||||
|
return
|
||||||
|
return messageModule.requestMoreMessages();
|
||||||
|
}
|
||||||
|
|
||||||
|
function fillGaps(messageId) {
|
||||||
|
if(!messageModule)
|
||||||
|
return
|
||||||
|
return messageModule.fillGaps(messageId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,10 +244,9 @@ Column {
|
||||||
id: gapComponent
|
id: gapComponent
|
||||||
GapComponent {
|
GapComponent {
|
||||||
onClicked: {
|
onClicked: {
|
||||||
// Not Refactored Yet - Should do it via messageStore
|
messageStore.fillGaps(messageId)
|
||||||
// root.chatsModel.messageView.fillGaps(messageStore.messageId);
|
root.visible = false;
|
||||||
// root.visible = false;
|
root.height = 0;
|
||||||
// root.height = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -258,8 +257,7 @@ Column {
|
||||||
nextMessageIndex: root.nextMessageIndex
|
nextMessageIndex: root.nextMessageIndex
|
||||||
nextMsgTimestamp: root.nextMsgTimestamp
|
nextMsgTimestamp: root.nextMsgTimestamp
|
||||||
onTimerTriggered: {
|
onTimerTriggered: {
|
||||||
// Not Refactored Yet - Should do it via messageStore
|
messageStore.requestMoreMessages();
|
||||||
// root.chatsModel.requestMoreMessages(Constants.fetchRangeLast24Hours);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue