Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/lib/alarms/csfloat_trade_pings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export async function pingTradeStatus(expectedSteamID?: string) {
let errors;

if (pendingTrades.length > 0) {
errors = await pingUpdates(pendingTrades);
errors = await pingUpdates(pendingTrades, access?.steam_id);
}

// Ping status of ext + permissions
Expand All @@ -75,7 +75,7 @@ interface UpdateErrors {
rollback_trades_error?: string;
}

async function pingUpdates(pendingTrades: SlimTrade[]): Promise<UpdateErrors> {
async function pingUpdates(pendingTrades: SlimTrade[], steamID?: string | null): Promise<UpdateErrors> {
const errors: UpdateErrors = {};

try {
Expand All @@ -93,14 +93,14 @@ async function pingUpdates(pendingTrades: SlimTrade[]): Promise<UpdateErrors> {

let tradeHistory: TradeHistoryStatus[] = [];
try {
tradeHistory = await pingTradeHistory(pendingTrades);
tradeHistory = await pingTradeHistory(pendingTrades, steamID);
} catch (e) {
console.error('failed to ping trade history', e);
errors.history_error = (e as any).toString();
}

try {
await pingSentTradeOffers(pendingTrades);
await pingSentTradeOffers(pendingTrades, steamID);
} catch (e) {
console.error('failed to ping sent trade offer state', e);
errors.trade_offer_error = (e as any).toString();
Expand Down
34 changes: 26 additions & 8 deletions src/lib/alarms/trade_history.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,45 @@
import {SlimTrade, Trade} from '../types/float_market';
import {SlimTrade} from '../types/float_market';
import {TradeHistoryStatus, TradeHistoryType} from '../bridge/handlers/trade_history_status';
import {AppId, TradeStatus} from '../types/steam_constants';
import {AppId, TradeOfferState, TradeStatus} from '../types/steam_constants';
import {clearAccessTokenFromStorage, getAccessToken} from './access_token';

export async function pingTradeHistory(pendingTrades: SlimTrade[]): Promise<TradeHistoryStatus[]> {
export async function pingTradeHistory(
pendingTrades: SlimTrade[],
steamID?: string | null
): Promise<TradeHistoryStatus[]> {
const {history, type} = await getTradeHistory();

// premature optimization in case it's 100 trades
const assetsToFind = pendingTrades.reduce(
(acc, e) => {
acc[e.contract.item.asset_id] = true;
acc[e.contract.item.asset_id] = e;
return acc;
},
{} as {[key: string]: boolean}
{} as {[key: string]: SlimTrade}
);

// We only want to send history that is relevant to verifying trades on CSFloat
const historyForCSFloat = history.filter((e) => {
const received_ids = e.received_assets.map((e) => e.asset_id);
const given_ids = e.given_assets.map((e) => e.asset_id);
return !![...received_ids, ...given_ids].find((e) => {
return assetsToFind[e];
});

const foundSlimTrades = [...received_ids, ...given_ids]
.map((e) => {
return assetsToFind[e];
})
.filter((e) => !!e);
if (!foundSlimTrades || foundSlimTrades.length === 0) {
return false;
}

// Have we already reported this status as a seller? If so, we can skip doing it again
if (
foundSlimTrades.every((t) => t.steam_offer?.state === TradeOfferState.Accepted && t.seller_id === steamID)
) {
return false;
}

return true;
});

if (historyForCSFloat.length === 0) {
Expand Down
21 changes: 17 additions & 4 deletions src/lib/alarms/trade_offer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,33 @@ import {HasPermissions} from '../bridge/handlers/has_permissions';
import {convertSteamID32To64} from '../utils/userinfo';
import {TradeHistoryStatus} from '../bridge/handlers/trade_history_status';

export async function pingSentTradeOffers(pendingTrades: SlimTrade[]) {
export async function pingSentTradeOffers(pendingTrades: SlimTrade[], steamID?: string | null) {
const {offers, type} = await getSentTradeOffers();

const offersToFind = pendingTrades.reduce(
(acc, e) => {
acc[e.steam_offer.id] = true;
if (!acc[e.steam_offer.id]) {
acc[e.steam_offer.id] = [];
}
acc[e.steam_offer.id].push(e);
return acc;
},
{} as {[key: string]: boolean}
{} as {[key: string]: SlimTrade[]}
);

// We only want to send offers that are relevant to verifying trades on CSFloat
const offersForCSFloat = offers.filter((e) => {
return !!offersToFind[e.offer_id];
const slimTrades = offersToFind[e.offer_id];
if (!slimTrades || slimTrades.length === 0) {
return false;
}

if (slimTrades.every((t) => t.steam_offer?.state === e.state && t.seller_id === steamID)) {
// We're pushing the same trade offer state update as a seller, this has no effect server-side, skip
return false;
}

return true;
});

if (offersForCSFloat.length > 0) {
Expand Down