Skip to content

Commit ddcb80c

Browse files
authored
Merge pull request #340 from csfloat/fix/cancel-ping-rollback
Fixes Sending Cancel Ping if Trade Rolled Back
2 parents 2b22f5c + 59ae167 commit ddcb80c

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

src/lib/alarms/csfloat_trade_pings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ async function pingUpdates(pendingTrades: Trade[]): Promise<UpdateErrors> {
107107
}
108108

109109
try {
110-
await pingCancelTrades(pendingTrades);
110+
await pingCancelTrades(pendingTrades, tradeHistory);
111111
} catch (e) {
112112
console.error('failed to ping cancel ping trade offers', e);
113113
}

src/lib/alarms/trade_offer.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {TradeOfferState} from '../types/steam_constants';
1+
import {TradeOfferState, TradeStatus} from '../types/steam_constants';
22
import {Trade, TradeState} from '../types/float_market';
33
import {OfferStatus, TradeOfferStatus, TradeOffersType} from '../bridge/handlers/trade_offer_status';
44
import {clearAccessTokenFromStorage, getAccessToken} from './access_token';
@@ -9,6 +9,7 @@ import {FetchSteamUser} from '../bridge/handlers/fetch_steam_user';
99
import {rgDescription} from '../types/steam';
1010
import {HasPermissions} from '../bridge/handlers/has_permissions';
1111
import {convertSteamID32To64} from '../utils/userinfo';
12+
import {TradeHistoryStatus} from '../bridge/handlers/trade_history_status';
1213

1314
export async function pingSentTradeOffers(pendingTrades: Trade[]) {
1415
const {offers, type} = await getSentTradeOffers();
@@ -67,7 +68,7 @@ export async function pingSentTradeOffers(pendingTrades: Trade[]) {
6768
}
6869
}
6970

70-
export async function pingCancelTrades(pendingTrades: Trade[]) {
71+
export async function pingCancelTrades(pendingTrades: Trade[], tradeHistory: TradeHistoryStatus[]) {
7172
const hasWaitForCancelPing = pendingTrades.find((e) => e.state === TradeState.PENDING && e.wait_for_cancel_ping);
7273
if (!hasWaitForCancelPing) {
7374
// Nothing to process/ping, exit
@@ -88,14 +89,26 @@ export async function pingCancelTrades(pendingTrades: Trade[]) {
8889
}
8990

9091
const tradeOffer = allTradeOffers.find((e) => e.offer_id === trade.steam_offer.id);
91-
if (
92-
tradeOffer &&
93-
(tradeOffer.state === TradeOfferState.Active || tradeOffer.state === TradeOfferState.Accepted)
94-
) {
95-
// We don't want to send a cancel ping if the offer is active or valid
92+
if (tradeOffer?.state === TradeOfferState.Active) {
93+
// We don't want to send a cancel ping if the offer is active since it can still become accepted
9694
continue;
9795
}
9896

97+
if (tradeOffer?.state === TradeOfferState.Accepted) {
98+
// We want to check whether the trade was rolled back from the buyer's perspective -- if so, we still want to ping
99+
const rolledBackTrade = (tradeHistory || []).find(
100+
(e) =>
101+
e.status === TradeStatus.TradeProtectionRollback &&
102+
!!e.received_assets.find((a) => a.asset_id === trade.contract?.item?.asset_id)
103+
);
104+
if (!rolledBackTrade) {
105+
// no rollback, trade offer was accepted, shouldn't cancel
106+
continue;
107+
}
108+
}
109+
110+
// No active/accepted offer, or it was rolled back
111+
99112
try {
100113
await PingCancelTrade.handleRequest({trade_id: trade.id, steam_id: tradeOffers.steam_id}, {});
101114
} catch (e) {

0 commit comments

Comments
 (0)