inactive command to show people not participating in OC

This commit is contained in:
2026-01-12 16:46:00 -05:00
parent 3b8aeff340
commit ee6dbc1df2
7 changed files with 428 additions and 21 deletions

View File

@@ -0,0 +1,85 @@
const { SlashCommandBuilder } = require('discord.js');
const fs = require('fs');
const path = require('path');
const { getMemberMap, processCrimes } = require('../../utils/ocLogic');
const torn = require('../../torn.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('scanoc')
.setDescription('Scans historical OCs to populate participation stats.')
.addIntegerOption(option =>
option.setName('days')
.setDescription('How many days back to scan (default 30)')
.setMinValue(1)
.setMaxValue(365)
),
async execute(interaction) {
await interaction.deferReply();
const days = interaction.options.getInteger('days') || 30;
const now = Date.now();
const fromTimestamp = Math.floor((now - (days * 24 * 60 * 60 * 1000)) / 1000);
const statsPath = path.join(__dirname, '../../data/ocStats.json');
// Load existing stats
let stats = {};
if (fs.existsSync(statsPath)) {
try {
stats = JSON.parse(fs.readFileSync(statsPath, 'utf8'));
} catch (e) {
console.error("scanOC: Failed to load ocStats.json", e);
}
}
// Fetch faction members
const memberMap = await getMemberMap(torn);
await interaction.editReply(`Scanning OCs from the last ${days} days...`);
let crimesList = [];
const categories = ['recruiting', 'planned', 'active', 'successful', 'failed'];
for (const cat of categories) {
try {
// Fetch with a higher limit since we are scanning back further
const crimes = await torn.faction.crimes({
from: fromTimestamp,
sort: 'ASC',
category: cat,
limit: 300 // Reasonable batch size?
});
if (crimes && Array.isArray(crimes)) {
crimesList = crimesList.concat(crimes);
}
} catch (e) {
console.error(`scanOC: Failed to fetch crimes for category '${cat}'`, e);
}
}
if (crimesList.length === 0) {
return interaction.editReply(`Scan complete. No OCs found in the last ${days} days.`);
}
// Process with utility
const updates = await processCrimes(crimesList, stats, memberMap, torn);
// Save
if (updates > 0) {
try {
const dir = path.dirname(statsPath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(statsPath, JSON.stringify(stats, null, 4));
await interaction.editReply(`Scan complete. Processed ${crimesList.length} crimes. Updated stats for ${updates} users.`);
} catch (e) {
console.error("scanOC: Failed to save stats", e);
await interaction.editReply(`Scan complete, but failed to save stats: ${e.message}`);
}
} else {
await interaction.editReply(`Scan complete. Processed ${crimesList.length} crimes. No new updates needed.`);
}
},
};