mirror of
https://github.com/haveno-dex/haveno.git
synced 2024-12-22 19:49:32 +00:00
Add API functions to support trade chat (#257)
This commit is contained in:
parent
e7b4627102
commit
2851319e3b
4 changed files with 102 additions and 3 deletions
|
@ -32,6 +32,7 @@ import bisq.core.payment.payload.PaymentMethod;
|
||||||
import bisq.core.support.dispute.Attachment;
|
import bisq.core.support.dispute.Attachment;
|
||||||
import bisq.core.support.dispute.Dispute;
|
import bisq.core.support.dispute.Dispute;
|
||||||
import bisq.core.support.dispute.DisputeResult;
|
import bisq.core.support.dispute.DisputeResult;
|
||||||
|
import bisq.core.support.messages.ChatMessage;
|
||||||
import bisq.core.trade.Trade;
|
import bisq.core.trade.Trade;
|
||||||
import bisq.core.trade.statistics.TradeStatistics3;
|
import bisq.core.trade.statistics.TradeStatistics3;
|
||||||
import bisq.core.trade.statistics.TradeStatisticsManager;
|
import bisq.core.trade.statistics.TradeStatisticsManager;
|
||||||
|
@ -543,4 +544,12 @@ public class CoreApi {
|
||||||
public String getTradeRole(String tradeId) {
|
public String getTradeRole(String tradeId) {
|
||||||
return coreTradesService.getTradeRole(tradeId);
|
return coreTradesService.getTradeRole(tradeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ChatMessage> getChatMessages(String tradeId) {
|
||||||
|
return coreTradesService.getChatMessages(tradeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendChatMessage(String tradeId, String message) {
|
||||||
|
coreTradesService.sendChatMessage(tradeId, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,10 @@ import bisq.core.btc.wallet.BtcWalletService;
|
||||||
import bisq.core.offer.Offer;
|
import bisq.core.offer.Offer;
|
||||||
import bisq.core.offer.OfferUtil;
|
import bisq.core.offer.OfferUtil;
|
||||||
import bisq.core.offer.takeoffer.TakeOfferModel;
|
import bisq.core.offer.takeoffer.TakeOfferModel;
|
||||||
|
import bisq.core.support.dispute.Dispute;
|
||||||
|
import bisq.core.support.messages.ChatMessage;
|
||||||
|
import bisq.core.support.traderchat.TradeChatSession;
|
||||||
|
import bisq.core.support.traderchat.TraderChatManager;
|
||||||
import bisq.core.trade.Tradable;
|
import bisq.core.trade.Tradable;
|
||||||
import bisq.core.trade.Trade;
|
import bisq.core.trade.Trade;
|
||||||
import bisq.core.trade.TradeManager;
|
import bisq.core.trade.TradeManager;
|
||||||
|
@ -58,10 +62,10 @@ class CoreTradesService {
|
||||||
// exception is made in this case.
|
// exception is made in this case.
|
||||||
private final CoreWalletsService coreWalletsService;
|
private final CoreWalletsService coreWalletsService;
|
||||||
private final BtcWalletService btcWalletService;
|
private final BtcWalletService btcWalletService;
|
||||||
private final OfferUtil offerUtil;
|
|
||||||
private final ClosedTradableManager closedTradableManager;
|
private final ClosedTradableManager closedTradableManager;
|
||||||
private final TakeOfferModel takeOfferModel;
|
private final TakeOfferModel takeOfferModel;
|
||||||
private final TradeManager tradeManager;
|
private final TradeManager tradeManager;
|
||||||
|
private final TraderChatManager traderChatManager;
|
||||||
private final TradeUtil tradeUtil;
|
private final TradeUtil tradeUtil;
|
||||||
private final User user;
|
private final User user;
|
||||||
|
|
||||||
|
@ -69,19 +73,19 @@ class CoreTradesService {
|
||||||
public CoreTradesService(CoreContext coreContext,
|
public CoreTradesService(CoreContext coreContext,
|
||||||
CoreWalletsService coreWalletsService,
|
CoreWalletsService coreWalletsService,
|
||||||
BtcWalletService btcWalletService,
|
BtcWalletService btcWalletService,
|
||||||
OfferUtil offerUtil,
|
|
||||||
ClosedTradableManager closedTradableManager,
|
ClosedTradableManager closedTradableManager,
|
||||||
TakeOfferModel takeOfferModel,
|
TakeOfferModel takeOfferModel,
|
||||||
TradeManager tradeManager,
|
TradeManager tradeManager,
|
||||||
|
TraderChatManager traderChatManager,
|
||||||
TradeUtil tradeUtil,
|
TradeUtil tradeUtil,
|
||||||
User user) {
|
User user) {
|
||||||
this.coreContext = coreContext;
|
this.coreContext = coreContext;
|
||||||
this.coreWalletsService = coreWalletsService;
|
this.coreWalletsService = coreWalletsService;
|
||||||
this.btcWalletService = btcWalletService;
|
this.btcWalletService = btcWalletService;
|
||||||
this.offerUtil = offerUtil;
|
|
||||||
this.closedTradableManager = closedTradableManager;
|
this.closedTradableManager = closedTradableManager;
|
||||||
this.takeOfferModel = takeOfferModel;
|
this.takeOfferModel = takeOfferModel;
|
||||||
this.tradeManager = tradeManager;
|
this.tradeManager = tradeManager;
|
||||||
|
this.traderChatManager = traderChatManager;
|
||||||
this.tradeUtil = tradeUtil;
|
this.tradeUtil = tradeUtil;
|
||||||
this.user = user;
|
this.user = user;
|
||||||
}
|
}
|
||||||
|
@ -237,6 +241,34 @@ class CoreTradesService {
|
||||||
return trades;
|
return trades;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<ChatMessage> getChatMessages(String tradeId) {
|
||||||
|
Trade trade;
|
||||||
|
var tradeOptional = tradeManager.getTradeById(tradeId);
|
||||||
|
if (tradeOptional.isPresent()) trade = tradeOptional.get();
|
||||||
|
else throw new IllegalStateException(format("trade with id '%s' not found", tradeId));
|
||||||
|
boolean isMaker = tradeManager.isMyOffer(trade.getOffer());
|
||||||
|
TradeChatSession tradeChatSession = new TradeChatSession(trade, !isMaker);
|
||||||
|
return tradeChatSession.getObservableChatMessageList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendChatMessage(String tradeId, String message) {
|
||||||
|
Trade trade;
|
||||||
|
var tradeOptional = tradeManager.getTradeById(tradeId);
|
||||||
|
if (tradeOptional.isPresent()) trade = tradeOptional.get();
|
||||||
|
else throw new IllegalStateException(format("trade with id '%s' not found", tradeId));
|
||||||
|
boolean isMaker = tradeManager.isMyOffer(trade.getOffer());
|
||||||
|
TradeChatSession tradeChatSession = new TradeChatSession(trade, !isMaker);
|
||||||
|
ChatMessage chatMessage = new ChatMessage(
|
||||||
|
traderChatManager.getSupportType(),
|
||||||
|
tradeChatSession.getTradeId(),
|
||||||
|
tradeChatSession.getClientId(),
|
||||||
|
tradeChatSession.isClient(),
|
||||||
|
message,
|
||||||
|
traderChatManager.getMyAddress());
|
||||||
|
traderChatManager.addAndPersistChatMessage(chatMessage);
|
||||||
|
traderChatManager.sendChatMessage(chatMessage);
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isFollowingBuyerProtocol(Trade trade) {
|
private boolean isFollowingBuyerProtocol(Trade trade) {
|
||||||
return tradeManager.getTradeProtocol(trade) instanceof BuyerProtocol;
|
return tradeManager.getTradeProtocol(trade) instanceof BuyerProtocol;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,18 +19,23 @@ package bisq.daemon.grpc;
|
||||||
|
|
||||||
import bisq.core.api.CoreApi;
|
import bisq.core.api.CoreApi;
|
||||||
import bisq.core.api.model.TradeInfo;
|
import bisq.core.api.model.TradeInfo;
|
||||||
|
import bisq.core.support.messages.ChatMessage;
|
||||||
import bisq.core.trade.Trade;
|
import bisq.core.trade.Trade;
|
||||||
|
|
||||||
import bisq.proto.grpc.ConfirmPaymentReceivedReply;
|
import bisq.proto.grpc.ConfirmPaymentReceivedReply;
|
||||||
import bisq.proto.grpc.ConfirmPaymentReceivedRequest;
|
import bisq.proto.grpc.ConfirmPaymentReceivedRequest;
|
||||||
import bisq.proto.grpc.ConfirmPaymentStartedReply;
|
import bisq.proto.grpc.ConfirmPaymentStartedReply;
|
||||||
import bisq.proto.grpc.ConfirmPaymentStartedRequest;
|
import bisq.proto.grpc.ConfirmPaymentStartedRequest;
|
||||||
|
import bisq.proto.grpc.GetChatMessagesReply;
|
||||||
|
import bisq.proto.grpc.GetChatMessagesRequest;
|
||||||
import bisq.proto.grpc.GetTradeReply;
|
import bisq.proto.grpc.GetTradeReply;
|
||||||
import bisq.proto.grpc.GetTradeRequest;
|
import bisq.proto.grpc.GetTradeRequest;
|
||||||
import bisq.proto.grpc.GetTradesReply;
|
import bisq.proto.grpc.GetTradesReply;
|
||||||
import bisq.proto.grpc.GetTradesRequest;
|
import bisq.proto.grpc.GetTradesRequest;
|
||||||
import bisq.proto.grpc.KeepFundsReply;
|
import bisq.proto.grpc.KeepFundsReply;
|
||||||
import bisq.proto.grpc.KeepFundsRequest;
|
import bisq.proto.grpc.KeepFundsRequest;
|
||||||
|
import bisq.proto.grpc.SendChatMessageReply;
|
||||||
|
import bisq.proto.grpc.SendChatMessageRequest;
|
||||||
import bisq.proto.grpc.TakeOfferReply;
|
import bisq.proto.grpc.TakeOfferReply;
|
||||||
import bisq.proto.grpc.TakeOfferRequest;
|
import bisq.proto.grpc.TakeOfferRequest;
|
||||||
import bisq.proto.grpc.WithdrawFundsReply;
|
import bisq.proto.grpc.WithdrawFundsReply;
|
||||||
|
@ -185,6 +190,37 @@ class GrpcTradesService extends TradesImplBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getChatMessages(GetChatMessagesRequest req,
|
||||||
|
StreamObserver<GetChatMessagesReply> responseObserver) {
|
||||||
|
try {
|
||||||
|
var tradeChats = coreApi.getChatMessages(req.getTradeId())
|
||||||
|
.stream()
|
||||||
|
.map(msg -> msg.toProtoNetworkEnvelope().getChatMessage())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
var reply = GetChatMessagesReply.newBuilder()
|
||||||
|
.addAllMessage(tradeChats)
|
||||||
|
.build();
|
||||||
|
responseObserver.onNext(reply);
|
||||||
|
responseObserver.onCompleted();
|
||||||
|
} catch (Throwable cause) {
|
||||||
|
exceptionHandler.handleException(log, cause, responseObserver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendChatMessage(SendChatMessageRequest req,
|
||||||
|
StreamObserver<SendChatMessageReply> responseObserver) {
|
||||||
|
try {
|
||||||
|
coreApi.sendChatMessage(req.getTradeId(), req.getMessage());
|
||||||
|
var reply = SendChatMessageReply.newBuilder().build();
|
||||||
|
responseObserver.onNext(reply);
|
||||||
|
responseObserver.onCompleted();
|
||||||
|
} catch (Throwable cause) {
|
||||||
|
exceptionHandler.handleException(log, cause, responseObserver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final ServerInterceptor[] interceptors() {
|
final ServerInterceptor[] interceptors() {
|
||||||
Optional<ServerInterceptor> rateMeteringInterceptor = rateMeteringInterceptor();
|
Optional<ServerInterceptor> rateMeteringInterceptor = rateMeteringInterceptor();
|
||||||
return rateMeteringInterceptor.map(serverInterceptor ->
|
return rateMeteringInterceptor.map(serverInterceptor ->
|
||||||
|
@ -202,6 +238,8 @@ class GrpcTradesService extends TradesImplBase {
|
||||||
put(getConfirmPaymentReceivedMethod().getFullMethodName(), new GrpcCallRateMeter(1, SECONDS));
|
put(getConfirmPaymentReceivedMethod().getFullMethodName(), new GrpcCallRateMeter(1, SECONDS));
|
||||||
put(getKeepFundsMethod().getFullMethodName(), new GrpcCallRateMeter(1, MINUTES));
|
put(getKeepFundsMethod().getFullMethodName(), new GrpcCallRateMeter(1, MINUTES));
|
||||||
put(getWithdrawFundsMethod().getFullMethodName(), new GrpcCallRateMeter(1, MINUTES));
|
put(getWithdrawFundsMethod().getFullMethodName(), new GrpcCallRateMeter(1, MINUTES));
|
||||||
|
put(getGetChatMessagesMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||||
|
put(getSendChatMessageMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||||
}}
|
}}
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -655,6 +655,10 @@ service Trades {
|
||||||
}
|
}
|
||||||
rpc WithdrawFunds (WithdrawFundsRequest) returns (WithdrawFundsReply) {
|
rpc WithdrawFunds (WithdrawFundsRequest) returns (WithdrawFundsReply) {
|
||||||
}
|
}
|
||||||
|
rpc GetChatMessages (GetChatMessagesRequest) returns (GetChatMessagesReply) {
|
||||||
|
}
|
||||||
|
rpc SendChatMessage (SendChatMessageRequest) returns (SendChatMessageReply) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
message TakeOfferRequest {
|
message TakeOfferRequest {
|
||||||
|
@ -712,6 +716,22 @@ message WithdrawFundsRequest {
|
||||||
message WithdrawFundsReply {
|
message WithdrawFundsReply {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetChatMessagesRequest {
|
||||||
|
string trade_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetChatMessagesReply {
|
||||||
|
repeated ChatMessage message = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SendChatMessageRequest {
|
||||||
|
string trade_id = 1;
|
||||||
|
string message = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SendChatMessageReply {
|
||||||
|
}
|
||||||
|
|
||||||
message TradeInfo {
|
message TradeInfo {
|
||||||
OfferInfo offer = 1;
|
OfferInfo offer = 1;
|
||||||
string trade_id = 2;
|
string trade_id = 2;
|
||||||
|
|
Loading…
Reference in a new issue