@ -39,6 +39,8 @@ import org.session.libsession.messaging.sending_receiving.attachments.Attachment
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview as SignalLinkPreview
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview as SignalLinkPreview
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel as SignalQuote
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel as SignalQuote
private val TAG = MessageSender :: class . java . simpleName
object MessageSender {
object MessageSender {
// Error
// Error
@ -61,16 +63,20 @@ object MessageSender {
}
}
// Convenience
// Convenience
fun send ( message : Message , destination : Destination ) : Promise < Unit , Exception > {
fun send ( message : Message , destination : Destination , isSyncMessage : Boolean = false ) : Promise < Unit , Exception > {
Log . d ( TAG , " send() called with: message = $message , destination = $destination , isSyncMessage = $isSyncMessage " )
return if ( destination is Destination . LegacyOpenGroup || destination is Destination . OpenGroup || destination is Destination . OpenGroupInbox ) {
return if ( destination is Destination . LegacyOpenGroup || destination is Destination . OpenGroup || destination is Destination . OpenGroupInbox ) {
sendToOpenGroupDestination ( destination , message )
sendToOpenGroupDestination ( destination , message )
} else {
} else {
sendToSnodeDestination ( destination , message )
sendToSnodeDestination ( destination , message , isSyncMessage )
}
}
}
}
// One-on-One Chats & Closed Groups
// One-on-One Chats & Closed Groups
private fun sendToSnodeDestination ( destination : Destination , message : Message , isSyncMessage : Boolean = false ) : Promise < Unit , Exception > {
private fun sendToSnodeDestination ( destination : Destination , message : Message , isSyncMessage : Boolean = false ) : Promise < Unit , Exception > {
Log . d ( TAG , " sendToSnodeDestination() called with: destination = $destination , message = $message , isSyncMessage = $isSyncMessage " )
val deferred = deferred < Unit , Exception > ( )
val deferred = deferred < Unit , Exception > ( )
val promise = deferred . promise
val promise = deferred . promise
val storage = MessagingModuleConfiguration . shared . storage
val storage = MessagingModuleConfiguration . shared . storage
@ -86,7 +92,7 @@ object MessageSender {
val isSelfSend = ( message . recipient == userPublicKey )
val isSelfSend = ( message . recipient == userPublicKey )
// Set the failure handler (need it here already for precondition failure handling)
// Set the failure handler (need it here already for precondition failure handling)
fun handleFailure ( error : Exception ) {
fun handleFailure ( error : Exception ) {
handleFailedMessageSend ( message , error )
handleFailedMessageSend ( message , error , isSyncMessage )
if ( destination is Destination . Contact && message is VisibleMessage && !is SelfSend ) {
if ( destination is Destination . Contact && message is VisibleMessage && !is SelfSend ) {
SnodeModule . shared . broadcaster . broadcast ( " messageFailed " , message . sentTimestamp !! )
SnodeModule . shared . broadcaster . broadcast ( " messageFailed " , message . sentTimestamp !! )
}
}
@ -220,6 +226,8 @@ object MessageSender {
// Open Groups
// Open Groups
private fun sendToOpenGroupDestination ( destination : Destination , message : Message ) : Promise < Unit , Exception > {
private fun sendToOpenGroupDestination ( destination : Destination , message : Message ) : Promise < Unit , Exception > {
Log . d ( TAG , " sendToOpenGroupDestination() called with: destination = $destination , message = $message " )
val deferred = deferred < Unit , Exception > ( )
val deferred = deferred < Unit , Exception > ( )
val storage = MessagingModuleConfiguration . shared . storage
val storage = MessagingModuleConfiguration . shared . storage
if ( message . sentTimestamp == null ) {
if ( message . sentTimestamp == null ) {
@ -318,6 +326,8 @@ object MessageSender {
// Result Handling
// Result Handling
fun handleSuccessfulMessageSend ( message : Message , destination : Destination , isSyncMessage : Boolean = false , openGroupSentTimestamp : Long = - 1 ) {
fun handleSuccessfulMessageSend ( message : Message , destination : Destination , isSyncMessage : Boolean = false , openGroupSentTimestamp : Long = - 1 ) {
Log . d ( TAG , " handleSuccessfulMessageSend() called with: message = $message , destination = $destination , isSyncMessage = $isSyncMessage , openGroupSentTimestamp = $openGroupSentTimestamp " )
val storage = MessagingModuleConfiguration . shared . storage
val storage = MessagingModuleConfiguration . shared . storage
val userPublicKey = storage . getUserPublicKey ( ) !!
val userPublicKey = storage . getUserPublicKey ( ) !!
// Ignore future self-sends
// Ignore future self-sends
@ -374,21 +384,32 @@ object MessageSender {
// • the destination was a contact
// • the destination was a contact
// • we didn't sync it already
// • we didn't sync it already
if ( destination is Destination . Contact && !is SyncMessage ) {
if ( destination is Destination . Contact && !is SyncMessage ) {
if ( message is VisibleMessage ) { message . syncTarget = destination . publicKey }
if ( message is VisibleMessage ) message . syncTarget = destination . publicKey
if ( message is ExpirationTimerUpdate ) { message . syncTarget = destination . publicKey }
if ( message is ExpirationTimerUpdate ) message . syncTarget = destination . publicKey
storage . markAsSyncing ( message . sentTimestamp !! , userPublicKey )
sendToSnodeDestination ( Destination . Contact ( userPublicKey ) , message , true )
sendToSnodeDestination ( Destination . Contact ( userPublicKey ) , message , true )
}
}
}
}
fun handleFailedMessageSend ( message : Message , error : Exception ) {
fun handleFailedMessageSend ( message : Message , error : Exception , isSyncMessage : Boolean = false ) {
Log . d ( TAG , " handleFailedMessageSend() called with: message = $message , error = $error , isSyncMessage = $isSyncMessage " )
val storage = MessagingModuleConfiguration . shared . storage
val storage = MessagingModuleConfiguration . shared . storage
val userPublicKey = storage . getUserPublicKey ( ) !!
val userPublicKey = storage . getUserPublicKey ( ) !!
storage . setErrorMessage ( message . sentTimestamp !! , message . sender ?: userPublicKey , error )
val timestamp = message . sentTimestamp !!
val author = message . sender ?: userPublicKey
if ( isSyncMessage ) storage . markAsSyncFailed ( timestamp , author , error )
else storage . markAsSentFailed ( timestamp , author , error )
}
}
// Convenience
// Convenience
@JvmStatic
@JvmStatic
fun send ( message : VisibleMessage , address : Address , attachments : List < SignalAttachment > , quote : SignalQuote ? , linkPreview : SignalLinkPreview ? ) {
fun send ( message : VisibleMessage , address : Address , attachments : List < SignalAttachment > , quote : SignalQuote ? , linkPreview : SignalLinkPreview ? ) {
Log . d ( TAG , " send() called with: message = $message , address = $address , attachments = $attachments , quote = $quote , linkPreview = $linkPreview " )
val messageDataProvider = MessagingModuleConfiguration . shared . messageDataProvider
val messageDataProvider = MessagingModuleConfiguration . shared . messageDataProvider
val attachmentIDs = messageDataProvider . getAttachmentIDsFor ( message . id !! )
val attachmentIDs = messageDataProvider . getAttachmentIDsFor ( message . id !! )
message . attachmentIDs . addAll ( attachmentIDs )
message . attachmentIDs . addAll ( attachmentIDs )
@ -407,6 +428,8 @@ object MessageSender {
@JvmStatic
@JvmStatic
fun send ( message : Message , address : Address ) {
fun send ( message : Message , address : Address ) {
Log . d ( TAG , " send() called with: message = $message , address = $address " )
val threadID = MessagingModuleConfiguration . shared . storage . getOrCreateThreadIdFor ( address )
val threadID = MessagingModuleConfiguration . shared . storage . getOrCreateThreadIdFor ( address )
message . threadID = threadID
message . threadID = threadID
val destination = Destination . from ( address )
val destination = Destination . from ( address )