From 241fbc47dd38691342342eda709e3eb8b97d2de3 Mon Sep 17 00:00:00 2001
From: ubruntu <bryantdeters@gmail.com>
Date: Fri, 1 Oct 2021 21:17:19 +0000
Subject: [PATCH] Trade fix (with hashmap awareness)

---
 server/src/events/invite.rs | 12 ++++++++++++
 server/src/events/trade.rs  |  1 +
 2 files changed, 13 insertions(+)

diff --git a/server/src/events/invite.rs b/server/src/events/invite.rs
index 2e08def75f..1fd56d2ba5 100644
--- a/server/src/events/invite.rs
+++ b/server/src/events/invite.rs
@@ -218,6 +218,18 @@ pub fn handle_invite_accept(server: &mut Server, entity: specs::Entity) {
                     (uids.get(inviter).copied(), uids.get(entity).copied())
                 {
                     let mut trades = state.ecs().write_resource::<Trades>();
+                    // check if the person that invited me has started a new trade since the
+                    // invitation was sent
+                    if trades.entity_trades.get(&inviter_uid).copied().is_some() {
+                        for client in clients.get(entity).into_iter().chain(clients.get(inviter)) {
+                            client.send_fallible(ServerGeneral::server_msg(
+                                ChatType::Meta,
+                                "Trade failed, inviter initiated new trade since sending trade \
+                                 request.",
+                            ));
+                        }
+                        return;
+                    }
                     let id = trades.begin_trade(inviter_uid, invitee_uid);
                     let trade = trades.trades[&id].clone();
                     if let Some(agent) = agents.get_mut(inviter) {
diff --git a/server/src/events/trade.rs b/server/src/events/trade.rs
index 351d4ecbe8..84277a9b73 100644
--- a/server/src/events/trade.rs
+++ b/server/src/events/trade.rs
@@ -102,6 +102,7 @@ pub fn handle_process_trade_action(
                                 AgentEvent::FinishedTrade(result.clone()),
                             );
                         }
+                        trades.entity_trades.remove_entry(party);
                     }
                 } else {
                     let mut entities: [Option<specs::Entity>; 2] = [None, None];