added steambot, trades and trasctions.
This commit is contained in:
192
index.js
192
index.js
@@ -20,6 +20,12 @@ import adminRoutes from "./routes/admin.js";
|
||||
|
||||
// Import services
|
||||
import pricingService from "./services/pricing.js";
|
||||
import { getSteamBotManager } from "./services/steamBot.js";
|
||||
|
||||
// Import models
|
||||
import User from "./models/User.js";
|
||||
import Trade from "./models/Trade.js";
|
||||
import Transaction from "./models/Transaction.js";
|
||||
|
||||
/**
|
||||
* Create and configure Fastify server
|
||||
@@ -342,6 +348,192 @@ const start = async () => {
|
||||
// Add WebSocket manager to fastify instance
|
||||
fastify.decorate("websocketManager", wsManager);
|
||||
|
||||
// Initialize Steam Bot Manager
|
||||
const botManager = getSteamBotManager();
|
||||
|
||||
// Setup trade event listeners
|
||||
botManager.on("tradeAccepted", async (offer, tradeData) => {
|
||||
console.log(`✅ Trade ${offer.id} accepted! Crediting user...`);
|
||||
|
||||
try {
|
||||
// Find the trade record
|
||||
const trade = await Trade.findOne({ offerId: offer.id });
|
||||
|
||||
if (!trade) {
|
||||
console.error(`❌ Trade record not found for offer ${offer.id}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (trade.state === "accepted") {
|
||||
console.log(`⚠️ Trade ${offer.id} already completed, skipping`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the user
|
||||
const user = await User.findById(trade.userId);
|
||||
|
||||
if (!user) {
|
||||
console.error(`❌ User not found for trade ${offer.id}`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Credit user balance
|
||||
user.balance += trade.totalValue;
|
||||
await user.save();
|
||||
|
||||
// Update trade status
|
||||
trade.state = "accepted";
|
||||
trade.completedAt = new Date();
|
||||
await trade.save();
|
||||
|
||||
// Create transaction record
|
||||
const transaction = new Transaction({
|
||||
user: user._id,
|
||||
type: "sale",
|
||||
amount: trade.totalValue,
|
||||
description: `Sold ${trade.items.length} item(s)`,
|
||||
status: "completed",
|
||||
metadata: {
|
||||
tradeId: trade._id,
|
||||
offerId: offer.id,
|
||||
botId: tradeData.botId,
|
||||
itemCount: trade.items.length,
|
||||
verificationCode: trade.verificationCode,
|
||||
},
|
||||
});
|
||||
await transaction.save();
|
||||
|
||||
console.log(
|
||||
`✅ Credited $${trade.totalValue.toFixed(2)} to user ${
|
||||
user.username
|
||||
} (Balance: $${user.balance.toFixed(2)})`
|
||||
);
|
||||
|
||||
// Notify user via WebSocket
|
||||
wsManager.sendToUser(user.steamId, {
|
||||
type: "trade_completed",
|
||||
data: {
|
||||
tradeId: trade._id,
|
||||
offerId: offer.id,
|
||||
amount: trade.totalValue,
|
||||
newBalance: user.balance,
|
||||
itemCount: trade.items.length,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
});
|
||||
|
||||
// Also send balance update
|
||||
wsManager.sendToUser(user.steamId, {
|
||||
type: "balance_update",
|
||||
data: {
|
||||
balance: user.balance,
|
||||
change: trade.totalValue,
|
||||
reason: "trade_completed",
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(`❌ Error processing accepted trade ${offer.id}:`, error);
|
||||
}
|
||||
});
|
||||
|
||||
botManager.on("tradeDeclined", async (offer, tradeData) => {
|
||||
console.log(`❌ Trade ${offer.id} declined`);
|
||||
|
||||
try {
|
||||
const trade = await Trade.findOne({ offerId: offer.id });
|
||||
|
||||
if (trade && trade.state === "pending") {
|
||||
trade.state = "declined";
|
||||
trade.completedAt = new Date();
|
||||
await trade.save();
|
||||
|
||||
// Notify user
|
||||
const user = await User.findById(trade.userId);
|
||||
if (user) {
|
||||
wsManager.sendToUser(user.steamId, {
|
||||
type: "trade_declined",
|
||||
data: {
|
||||
tradeId: trade._id,
|
||||
offerId: offer.id,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ Error processing declined trade ${offer.id}:`, error);
|
||||
}
|
||||
});
|
||||
|
||||
botManager.on("tradeExpired", async (offer, tradeData) => {
|
||||
console.log(`⏰ Trade ${offer.id} expired`);
|
||||
|
||||
try {
|
||||
const trade = await Trade.findOne({ offerId: offer.id });
|
||||
|
||||
if (trade && trade.state === "pending") {
|
||||
trade.state = "expired";
|
||||
trade.completedAt = new Date();
|
||||
await trade.save();
|
||||
|
||||
// Notify user
|
||||
const user = await User.findById(trade.userId);
|
||||
if (user) {
|
||||
wsManager.sendToUser(user.steamId, {
|
||||
type: "trade_expired",
|
||||
data: {
|
||||
tradeId: trade._id,
|
||||
offerId: offer.id,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ Error processing expired trade ${offer.id}:`, error);
|
||||
}
|
||||
});
|
||||
|
||||
botManager.on("tradeCanceled", async (offer, tradeData) => {
|
||||
console.log(`🚫 Trade ${offer.id} canceled`);
|
||||
|
||||
try {
|
||||
const trade = await Trade.findOne({ offerId: offer.id });
|
||||
|
||||
if (trade && trade.state === "pending") {
|
||||
trade.state = "canceled";
|
||||
trade.completedAt = new Date();
|
||||
await trade.save();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ Error processing canceled trade ${offer.id}:`, error);
|
||||
}
|
||||
});
|
||||
|
||||
botManager.on("botError", (error, botId) => {
|
||||
console.error(`❌ Bot ${botId} error:`, error);
|
||||
});
|
||||
|
||||
// Initialize bots if config exists
|
||||
if (process.env.STEAM_BOT_AUTO_START === "true") {
|
||||
try {
|
||||
console.log("🤖 Auto-starting Steam bots...");
|
||||
// You can load bot config from file or env vars
|
||||
// const botsConfig = require("./config/steam-bots.json");
|
||||
// await botManager.initialize(botsConfig);
|
||||
console.log("⚠️ Bot auto-start enabled but no config found");
|
||||
console.log(
|
||||
" Configure bots in config/steam-bots.json or via env vars"
|
||||
);
|
||||
} catch (error) {
|
||||
console.error("❌ Failed to initialize bots:", error.message);
|
||||
}
|
||||
} else {
|
||||
console.log(
|
||||
"🤖 Steam bots not auto-started (set STEAM_BOT_AUTO_START=true to enable)"
|
||||
);
|
||||
}
|
||||
|
||||
// Register plugins
|
||||
await registerPlugins(fastify);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user