From c13fb950e3facaa6d041ff561422dccbacbf40ff Mon Sep 17 00:00:00 2001 From: jmacxx <47253594+jmacxx@users.noreply.github.com> Date: Tue, 5 Oct 2021 12:01:41 -0500 Subject: [PATCH] Allow trader chat after trade complete --- .../bisq/core/support/SupportManager.java | 4 +- .../core/support/dispute/DisputeManager.java | 3 +- .../support/traderchat/TraderChatManager.java | 46 ++++++++++++++----- .../pendingtrades/PendingTradesView.java | 13 +----- .../bisq/desktop/main/shared/ChatView.java | 5 +- .../support/dispute/DisputeChatPopup.java | 2 +- 6 files changed, 42 insertions(+), 31 deletions(-) diff --git a/core/src/main/java/bisq/core/support/SupportManager.java b/core/src/main/java/bisq/core/support/SupportManager.java index d353ed06068..099afff187f 100644 --- a/core/src/main/java/bisq/core/support/SupportManager.java +++ b/core/src/main/java/bisq/core/support/SupportManager.java @@ -95,7 +95,7 @@ public SupportManager(P2PService p2PService, WalletsSetup walletsSetup) { public abstract boolean channelOpen(ChatMessage message); - public abstract List getAllChatMessages(); + public abstract List getAllChatMessages(String tradeId); public abstract void addAndPersistChatMessage(ChatMessage message); @@ -170,7 +170,7 @@ private void onAckMessage(AckMessage ackMessage) { ackMessage.getSourceMsgClassName(), ackMessage.getSourceId(), ackMessage.getErrorMessage()); } - getAllChatMessages().stream() + getAllChatMessages(ackMessage.getSourceId()).stream() .filter(msg -> msg.getUid().equals(ackMessage.getSourceUid())) .forEach(msg -> { if (ackMessage.isSuccess()) diff --git a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java index 6abb55ffcbc..c02641b1bdc 100644 --- a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java +++ b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java @@ -166,8 +166,9 @@ public PubKeyRing getPeerPubKeyRing(ChatMessage message) { } @Override - public List getAllChatMessages() { + public List getAllChatMessages(String tradeId) { return getDisputeList().stream() + .filter(dispute -> dispute.getTradeId().equals(tradeId)) .flatMap(dispute -> dispute.getChatMessages().stream()) .collect(Collectors.toList()); } diff --git a/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java b/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java index a2dc887ad9e..1c44185f2a8 100644 --- a/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java +++ b/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java @@ -25,6 +25,8 @@ import bisq.core.support.messages.SupportMessage; import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.failed.FailedTradesManager; import bisq.network.p2p.AckMessageSourceType; import bisq.network.p2p.NodeAddress; @@ -35,10 +37,10 @@ import javax.inject.Inject; import javax.inject.Singleton; -import javafx.collections.ObservableList; +import javafx.collections.FXCollections; import java.util.List; -import java.util.stream.Collectors; +import java.util.Optional; import lombok.extern.slf4j.Slf4j; @@ -46,6 +48,8 @@ @Singleton public class TraderChatManager extends SupportManager { private final TradeManager tradeManager; + private final ClosedTradableManager closedTradableManager; + private final FailedTradesManager failedTradesManager; private final PubKeyRing pubKeyRing; @@ -57,9 +61,13 @@ public class TraderChatManager extends SupportManager { public TraderChatManager(P2PService p2PService, WalletsSetup walletsSetup, TradeManager tradeManager, + ClosedTradableManager closedTradableManager, + FailedTradesManager failedTradesManager, PubKeyRing pubKeyRing) { super(p2PService, walletsSetup); this.tradeManager = tradeManager; + this.closedTradableManager = closedTradableManager; + this.failedTradesManager = failedTradesManager; this.pubKeyRing = pubKeyRing; } @@ -80,7 +88,7 @@ public void requestPersistence() { @Override public NodeAddress getPeerNodeAddress(ChatMessage message) { - return tradeManager.getTradeById(message.getTradeId()).map(trade -> { + return getTradeForChat(message).map(trade -> { if (trade.getContract() != null) { return trade.getContract().getPeersNodeAddress(pubKeyRing); } else { @@ -91,7 +99,7 @@ public NodeAddress getPeerNodeAddress(ChatMessage message) { @Override public PubKeyRing getPeerPubKeyRing(ChatMessage message) { - return tradeManager.getTradeById(message.getTradeId()).map(trade -> { + return getTradeForChat(message).map(trade -> { if (trade.getContract() != null) { return trade.getContract().getPeersPubKeyRing(pubKeyRing); } else { @@ -101,21 +109,19 @@ public PubKeyRing getPeerPubKeyRing(ChatMessage message) { } @Override - public List getAllChatMessages() { - return tradeManager.getObservableList().stream() - .flatMap(trade -> trade.getChatMessages().stream()) - .collect(Collectors.toList()); + public List getAllChatMessages(String tradeId) { + return getTradeById(tradeId).map(trade -> trade.getChatMessages()).orElse(FXCollections.emptyObservableList()); } @Override public boolean channelOpen(ChatMessage message) { - return tradeManager.getTradeById(message.getTradeId()).isPresent(); + return getTradeForChat(message).isPresent(); } @Override public void addAndPersistChatMessage(ChatMessage message) { - tradeManager.getTradeById(message.getTradeId()).ifPresent(trade -> { - ObservableList chatMessages = trade.getChatMessages(); + getTradeForChat(message).ifPresent(trade -> { + List chatMessages = trade.getChatMessages(); if (chatMessages.stream().noneMatch(m -> m.getUid().equals(message.getUid()))) { if (chatMessages.isEmpty()) { addSystemMsg(trade); @@ -172,4 +178,22 @@ public void addSystemMsg(Trade trade) { requestPersistence(); } + + private Optional getTradeById(String tradeId) { + // search for a matching tradeId in open trades, else closed trades, else failed trades + Optional trade = tradeManager.getTradeById(tradeId); + if (!trade.isPresent()) { + trade = closedTradableManager.getClosedTrades().stream() + .filter(e -> e.getId().equals(tradeId)) + .findFirst(); + if (!trade.isPresent()) { + trade = failedTradesManager.getTradeById(tradeId); + } + } + return trade; + } + + private Optional getTradeForChat(ChatMessage message) { + return getTradeById(message.getTradeId()); + } } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java index 38acf82510f..1ecd4ac02b9 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java @@ -148,7 +148,6 @@ public interface ChatCallback { private final Map buttonByTrade = new HashMap<>(); private final Map badgeByTrade = new HashMap<>(); private final Map> listenerByTrade = new HashMap<>(); - private ChangeListener tradeStateListener; private ChangeListener disputeStateListener; private ChangeListener mediationResultStateListener; private ChangeListener getMempoolStatusListener; @@ -455,7 +454,7 @@ private void openChat(Trade trade) { model.dataModel.getTradeManager().requestPersistence(); tradeIdOfOpenChat = trade.getId(); - ChatView chatView = new ChatView(traderChatManager, formatter, Res.get("offerbook.trader")); + ChatView chatView = new ChatView(traderChatManager, Res.get("offerbook.trader")); chatView.setAllowAttachments(false); chatView.setDisplayHeader(false); chatView.initialize(); @@ -470,15 +469,6 @@ private void openChat(Trade trade) { boolean isTaker = !model.dataModel.isMaker(trade.getOffer()); TradeChatSession tradeChatSession = new TradeChatSession(trade, isTaker); - tradeStateListener = (observable, oldValue, newValue) -> { - if (trade.isPayoutPublished()) { - if (chatPopupStage.isShowing()) { - chatPopupStage.hide(); - } - } - }; - trade.stateProperty().addListener(tradeStateListener); - disputeStateListener = (observable, oldValue, newValue) -> { if (newValue == Trade.DisputeState.DISPUTE_CLOSED || newValue == Trade.DisputeState.REFUND_REQUEST_CLOSED) { chatPopupStage.hide(); @@ -521,7 +511,6 @@ private void openChat(Trade trade) { chatPopupStage.xProperty().removeListener(yPositionListener); } - trade.stateProperty().removeListener(tradeStateListener); trade.disputeStateProperty().addListener(disputeStateListener); trade.mediationResultStateProperty().addListener(mediationResultStateListener); traderChatManager.requestPersistence(); diff --git a/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java b/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java index 07a24889b7b..5313041a1de 100644 --- a/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java +++ b/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java @@ -32,7 +32,6 @@ import bisq.core.support.SupportSession; import bisq.core.support.dispute.Attachment; import bisq.core.support.messages.ChatMessage; -import bisq.core.util.coin.CoinFormatter; import bisq.network.p2p.network.Connection; @@ -133,15 +132,13 @@ public class ChatView extends AnchorPane { private ChangeListener storedInMailboxPropertyListener, acknowledgedPropertyListener; private ChangeListener sendMessageErrorPropertyListener; - protected final CoinFormatter formatter; private EventHandler keyEventEventHandler; private SupportManager supportManager; private Optional optionalSupportSession = Optional.empty(); private String counterpartyName; - public ChatView(SupportManager supportManager, CoinFormatter formatter, String counterpartyName) { + public ChatView(SupportManager supportManager, String counterpartyName) { this.supportManager = supportManager; - this.formatter = formatter; this.counterpartyName = counterpartyName; allowAttachments = true; displayHeader = true; diff --git a/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeChatPopup.java b/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeChatPopup.java index 8c597b5a359..73294461476 100644 --- a/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeChatPopup.java +++ b/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeChatPopup.java @@ -90,7 +90,7 @@ public void openChat(Dispute selectedDispute, DisputeSession concreteDisputeSess selectedDispute.getChatMessages().forEach(m -> m.setWasDisplayed(true)); disputeManager.requestPersistence(); - ChatView chatView = new ChatView(disputeManager, formatter, counterpartyName); + ChatView chatView = new ChatView(disputeManager, counterpartyName); chatView.setAllowAttachments(true); chatView.setDisplayHeader(false); chatView.initialize();