92 lines
2.1 KiB
JavaScript
92 lines
2.1 KiB
JavaScript
const { connectToDatabase } = require('../db');
|
|
|
|
const MODERATION_COLLECTION = 'moderation_records';
|
|
|
|
const getModerationCollection = async () => {
|
|
const client = await connectToDatabase();
|
|
return client.db('discord').collection(MODERATION_COLLECTION);
|
|
};
|
|
|
|
const updateStrikes = async ({ guildId, userId, strikes }) => {
|
|
const collection = await getModerationCollection();
|
|
const now = new Date();
|
|
|
|
return collection.findOneAndUpdate(
|
|
{ guildId, userId },
|
|
{
|
|
$set: {
|
|
strikes,
|
|
lastWarnedAt: now,
|
|
updatedAt: now,
|
|
},
|
|
$setOnInsert: {
|
|
guildId,
|
|
userId,
|
|
actions: [],
|
|
createdAt: now,
|
|
},
|
|
},
|
|
{ upsert: true, returnDocument: 'after' },
|
|
);
|
|
};
|
|
|
|
const recordModerationAction = async ({
|
|
guildId,
|
|
userId,
|
|
action,
|
|
moderatorId,
|
|
reason,
|
|
metadata = {},
|
|
stateUpdates = {},
|
|
}) => {
|
|
const collection = await getModerationCollection();
|
|
const now = new Date();
|
|
const actionEntry = {
|
|
action,
|
|
moderatorId,
|
|
reason,
|
|
metadata,
|
|
createdAt: now,
|
|
};
|
|
|
|
return collection.findOneAndUpdate(
|
|
{ guildId, userId },
|
|
{
|
|
$push: { actions: actionEntry },
|
|
$set: {
|
|
lastAction: action,
|
|
lastActionAt: now,
|
|
updatedAt: now,
|
|
...stateUpdates,
|
|
},
|
|
$setOnInsert: {
|
|
guildId,
|
|
userId,
|
|
strikes: 0,
|
|
createdAt: now,
|
|
},
|
|
},
|
|
{ upsert: true, returnDocument: 'after' },
|
|
);
|
|
};
|
|
|
|
const clearBanStatus = async ({ guildId, userId }) =>
|
|
recordModerationAction({
|
|
guildId,
|
|
userId,
|
|
action: 'unban',
|
|
moderatorId: null,
|
|
reason: 'Temporary ban expired',
|
|
metadata: {},
|
|
stateUpdates: {
|
|
isBanned: false,
|
|
bannedUntil: null,
|
|
},
|
|
});
|
|
|
|
module.exports = {
|
|
updateStrikes,
|
|
recordModerationAction,
|
|
clearBanStatus,
|
|
};
|