Skip to content

Commit 360987e

Browse files
authored
Merge pull request #253 from csfloat/feature/cancel-unconfirmed-offers-for-sales
Auto-Cancel Unconfirmed Trade Offers for CSFloat Sales
2 parents e0de1e6 + 420aa24 commit 360987e

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

src/lib/alarms/csfloat_trade_pings.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {Trade} from '../types/float_market';
22
import {FetchPendingTrades} from '../bridge/handlers/fetch_pending_trades';
33
import {pingTradeHistory} from './trade_history';
4-
import {pingCancelTrades, pingSentTradeOffers} from './trade_offer';
4+
import {cancelUnconfirmedTradeOffers, pingCancelTrades, pingSentTradeOffers} from './trade_offer';
55
import {HasPermissions} from '../bridge/handlers/has_permissions';
66
import {PingExtensionStatus} from '../bridge/handlers/ping_extension_status';
77
import {AccessToken, getAccessToken} from './access_token';
@@ -72,6 +72,12 @@ interface UpdateErrors {
7272
async function pingUpdates(pendingTrades: Trade[]): Promise<UpdateErrors> {
7373
const errors: UpdateErrors = {};
7474

75+
try {
76+
await cancelUnconfirmedTradeOffers(pendingTrades);
77+
} catch (e) {
78+
console.error(`failed to cancel unconfirmed trade offers`, e);
79+
}
80+
7581
try {
7682
await pingTradeHistory(pendingTrades);
7783
} catch (e) {

src/lib/alarms/trade_offer.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {OfferStatus, TradeOfferStatus, TradeOffersType} from '../bridge/handlers
44
import {clearAccessTokenFromStorage, getAccessToken} from './access_token';
55
import {AnnotateOffer} from '../bridge/handlers/annotate_offer';
66
import {PingCancelTrade} from '../bridge/handlers/ping_cancel_trade';
7+
import {CancelTradeOffer} from '../bridge/handlers/cancel_trade_offer';
8+
import {FetchSteamUser} from '../bridge/handlers/fetch_steam_user';
79

810
export async function pingSentTradeOffers(pendingTrades: Trade[]) {
911
const {offers, type} = await getSentTradeOffers();
@@ -94,6 +96,57 @@ export async function pingCancelTrades(pendingTrades: Trade[]) {
9496
}
9597
}
9698
}
99+
100+
// cancelUnconfirmedTradeOffers related to sales on CSFloat that haven't been confirmed for a while
101+
// Helps prevent the user from sending a trade offer _way after_ the sale has already failed
102+
export async function cancelUnconfirmedTradeOffers(pendingTrades: Trade[]) {
103+
const offerIDsToCancel = [
104+
...new Set(
105+
pendingTrades
106+
.filter(
107+
(e) =>
108+
e.steam_offer.state === TradeOfferState.CreatedNeedsConfirmation &&
109+
new Date(e.steam_offer.sent_at).getTime() < Date.now() - 60 * 60 * 1000
110+
)
111+
.map((e) => e.steam_offer.id)
112+
),
113+
];
114+
115+
if (offerIDsToCancel.length === 0) {
116+
return;
117+
}
118+
119+
const resp = await getSentTradeOffers();
120+
121+
const offersIDsStillNeedsConfirmation = offerIDsToCancel.filter((id) => {
122+
const sentOffer = resp.offers.find((offer) => offer.offer_id === id);
123+
if (!sentOffer) {
124+
return false;
125+
}
126+
127+
return sentOffer.state === TradeOfferState.CreatedNeedsConfirmation;
128+
});
129+
130+
if (offersIDsStillNeedsConfirmation.length === 0) {
131+
return;
132+
}
133+
134+
const steamUser = await FetchSteamUser.handleRequest({}, {});
135+
if (!steamUser.sessionID) {
136+
// Can't cancel offers without a session
137+
return;
138+
}
139+
140+
for (const offerID of offersIDsStillNeedsConfirmation) {
141+
try {
142+
await CancelTradeOffer.handleRequest({trade_offer_id: offerID, session_id: steamUser.sessionID}, {});
143+
} catch (e: any) {
144+
console.error(`failed to cancel needs confirmation trade, returning early: ${e.toString()}`);
145+
return;
146+
}
147+
}
148+
}
149+
97150
async function getEnglishSentTradeOffersHTML(): Promise<string> {
98151
const resp = await fetch(`https://steamcommunity.com/id/me/tradeoffers/sent`, {
99152
credentials: 'include',

src/lib/types/float_market.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export enum TradeState {
8484
export interface SteamOffer {
8585
id: string;
8686
state: TradeOfferState;
87+
sent_at: string;
8788
}
8889

8990
export interface Trade {

0 commit comments

Comments
 (0)