small changes to UI/UX
This commit is contained in:
@@ -7,7 +7,11 @@ const {
|
|||||||
const {
|
const {
|
||||||
reconcileUserAchievements,
|
reconcileUserAchievements,
|
||||||
reconcileAllAchievements,
|
reconcileAllAchievements,
|
||||||
auditProfileData
|
grantMaintenanceReward,
|
||||||
|
getMaintenanceRewardStatus,
|
||||||
|
auditProfileData,
|
||||||
|
DEFAULT_MAINTENANCE_REWARD_ID,
|
||||||
|
DEFAULT_MAINTENANCE_REWARD_AMOUNT
|
||||||
} = require(
|
} = require(
|
||||||
"../../utils/profileMaintenance"
|
"../../utils/profileMaintenance"
|
||||||
);
|
);
|
||||||
@@ -67,6 +71,69 @@ module.exports = {
|
|||||||
.setDescription(
|
.setDescription(
|
||||||
"Audit stored profile statistics for inconsistencies"
|
"Audit stored profile statistics for inconsistencies"
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
.addSubcommand(
|
||||||
|
subcommand =>
|
||||||
|
subcommand
|
||||||
|
.setName(
|
||||||
|
"maintenance-reward"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
"Grant an idempotent maintenance reward to stored profile users"
|
||||||
|
)
|
||||||
|
.addStringOption(
|
||||||
|
option =>
|
||||||
|
option
|
||||||
|
.setName(
|
||||||
|
"reward-id"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
`Unique reward ID; defaults to ${DEFAULT_MAINTENANCE_REWARD_ID}`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.addIntegerOption(
|
||||||
|
option =>
|
||||||
|
option
|
||||||
|
.setName(
|
||||||
|
"amount"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
`Cookies per player; defaults to ${DEFAULT_MAINTENANCE_REWARD_AMOUNT}`
|
||||||
|
)
|
||||||
|
.setMinValue(
|
||||||
|
1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.addBooleanOption(
|
||||||
|
option =>
|
||||||
|
option
|
||||||
|
.setName(
|
||||||
|
"dry-run"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
"Preview recipients without granting Cookies"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.addSubcommand(
|
||||||
|
subcommand =>
|
||||||
|
subcommand
|
||||||
|
.setName(
|
||||||
|
"maintenance-status"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
"Show maintenance reward claim status"
|
||||||
|
)
|
||||||
|
.addStringOption(
|
||||||
|
option =>
|
||||||
|
option
|
||||||
|
.setName(
|
||||||
|
"reward-id"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
`Reward ID; defaults to ${DEFAULT_MAINTENANCE_REWARD_ID}`
|
||||||
|
)
|
||||||
|
)
|
||||||
),
|
),
|
||||||
|
|
||||||
async execute(
|
async execute(
|
||||||
@@ -98,6 +165,7 @@ module.exports = {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
if (
|
if (
|
||||||
subcommand ===
|
subcommand ===
|
||||||
"reconcile"
|
"reconcile"
|
||||||
@@ -228,6 +296,222 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (
|
||||||
|
subcommand ===
|
||||||
|
"maintenance-reward"
|
||||||
|
) {
|
||||||
|
const rewardId =
|
||||||
|
interaction.options.getString(
|
||||||
|
"reward-id"
|
||||||
|
)
|
||||||
|
??
|
||||||
|
DEFAULT_MAINTENANCE_REWARD_ID;
|
||||||
|
|
||||||
|
|
||||||
|
const amount =
|
||||||
|
interaction.options.getInteger(
|
||||||
|
"amount"
|
||||||
|
)
|
||||||
|
??
|
||||||
|
DEFAULT_MAINTENANCE_REWARD_AMOUNT;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Safer admin default:
|
||||||
|
*
|
||||||
|
* If omitted, maintenance-reward previews
|
||||||
|
* instead of paying immediately.
|
||||||
|
*
|
||||||
|
* Pass dry-run:false explicitly to execute.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const dryRun =
|
||||||
|
interaction.options.getBoolean(
|
||||||
|
"dry-run"
|
||||||
|
)
|
||||||
|
??
|
||||||
|
true;
|
||||||
|
|
||||||
|
|
||||||
|
const summary =
|
||||||
|
await grantMaintenanceReward({
|
||||||
|
guildId:
|
||||||
|
interaction.guildId,
|
||||||
|
|
||||||
|
rewardId,
|
||||||
|
|
||||||
|
amount,
|
||||||
|
|
||||||
|
dryRun
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
return interaction.editReply({
|
||||||
|
embeds: [
|
||||||
|
new EmbedBuilder()
|
||||||
|
.setTitle(
|
||||||
|
dryRun
|
||||||
|
? "🧪 Maintenance Reward Dry Run"
|
||||||
|
: "🎁 Maintenance Reward"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
dryRun
|
||||||
|
? "No Cookies were granted. Run again with `dry-run:false` to execute this reward."
|
||||||
|
: `Maintenance compensation **${rewardId}** has been processed.`
|
||||||
|
)
|
||||||
|
.addFields(
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Reward ID",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`\`${summary.rewardId}\``,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Per player",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${summary.amount.toLocaleString()} 🍪**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Stored profiles",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${summary.users}**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
dryRun
|
||||||
|
? "Would receive"
|
||||||
|
: "Granted",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${dryRun ? summary.eligible : summary.granted}**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Already claimed",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${summary.alreadyClaimed}**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Failed",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${summary.failed}**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (
|
||||||
|
subcommand ===
|
||||||
|
"maintenance-status"
|
||||||
|
) {
|
||||||
|
const rewardId =
|
||||||
|
interaction.options.getString(
|
||||||
|
"reward-id"
|
||||||
|
)
|
||||||
|
??
|
||||||
|
DEFAULT_MAINTENANCE_REWARD_ID;
|
||||||
|
|
||||||
|
|
||||||
|
const status =
|
||||||
|
await getMaintenanceRewardStatus({
|
||||||
|
guildId:
|
||||||
|
interaction.guildId,
|
||||||
|
|
||||||
|
rewardId
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
return interaction.editReply({
|
||||||
|
embeds: [
|
||||||
|
new EmbedBuilder()
|
||||||
|
.setTitle(
|
||||||
|
"🎁 Maintenance Reward Status"
|
||||||
|
)
|
||||||
|
.addFields(
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Reward ID",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`\`${status.rewardId}\``,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Default amount",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${status.amount.toLocaleString()} 🍪**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Stored profiles",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${status.users}**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Claimed",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${status.claimed}**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name:
|
||||||
|
"Remaining",
|
||||||
|
|
||||||
|
value:
|
||||||
|
`**${status.remaining}**`,
|
||||||
|
|
||||||
|
inline:
|
||||||
|
true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const audit =
|
const audit =
|
||||||
await auditProfileData(
|
await auditProfileData(
|
||||||
interaction.guildId
|
interaction.guildId
|
||||||
@@ -321,4 +605,25 @@ module.exports = {
|
|||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catch (error) {
|
||||||
|
console.error(
|
||||||
|
`[ProfileAdmin] ${subcommand} failed:`,
|
||||||
|
error
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
return interaction.editReply({
|
||||||
|
embeds: [
|
||||||
|
new EmbedBuilder()
|
||||||
|
.setTitle(
|
||||||
|
"❌ Profile Admin Error"
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
"The maintenance action failed. Check the bot logs for details."
|
||||||
|
)
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
@@ -2929,6 +2929,10 @@ function formatCategoryName(
|
|||||||
"🏅 Other",
|
"🏅 Other",
|
||||||
activity:
|
activity:
|
||||||
"📅 Activity",
|
"📅 Activity",
|
||||||
|
vault:
|
||||||
|
"🏦 Vault",
|
||||||
|
victim:
|
||||||
|
"🎯 Victim",
|
||||||
};
|
};
|
||||||
|
|
||||||
return labels[category] ??
|
return labels[category] ??
|
||||||
|
|||||||
Reference in New Issue
Block a user