124 lines
3.8 KiB
TypeScript
124 lines
3.8 KiB
TypeScript
import i18next from 'i18next';
|
|
import { CommandInteraction } from 'discord.js';
|
|
import config from '../../../../config.json';
|
|
import logger from '../../../handlers/logger';
|
|
import users from '../../../helpers/database/models/userSchema';
|
|
import timeouts from '../../../helpers/database/models/timeoutSchema';
|
|
|
|
export default async (interaction: CommandInteraction) => {
|
|
// Destructure member
|
|
const { member } = interaction;
|
|
|
|
// Get options
|
|
const target = await interaction.options.getUser('target');
|
|
const type = await interaction.options.getString('type');
|
|
|
|
// Get user object
|
|
const userDB = await users.findOne({
|
|
userId: interaction?.user?.id,
|
|
guildId: interaction?.guild?.id,
|
|
});
|
|
|
|
// Check if user has a timeout
|
|
const isTimeout = await timeouts.findOne({
|
|
guildId: interaction?.guild?.id,
|
|
userId: interaction?.user?.id,
|
|
timeoutId: 2,
|
|
});
|
|
|
|
// If user is not on timeout
|
|
if (!isTimeout) {
|
|
// Do not allow self reputation
|
|
if (target?.id === interaction?.user?.id) {
|
|
// Create embed object
|
|
const embed = {
|
|
title: ':loudspeaker: Reputation - Give',
|
|
description: 'You can not repute yourself.',
|
|
timestamp: new Date(),
|
|
color: config.colors.error as any,
|
|
footer: { iconURL: config.footer.icon, text: config.footer.text },
|
|
};
|
|
|
|
// Send interaction reply
|
|
return interaction.editReply({ embeds: [embed] });
|
|
}
|
|
|
|
// If type is positive
|
|
if (type === 'positive') {
|
|
userDB.reputation += 1;
|
|
}
|
|
|
|
// If type is negative
|
|
if (type === 'negative') {
|
|
userDB.reputation -= 1;
|
|
}
|
|
|
|
// Save user
|
|
await userDB.save().then(async () => {
|
|
// Create embed object
|
|
const embed = {
|
|
title: ':loudspeaker: Reputation - Give',
|
|
description: `You have given ${target} a ${type} reputation!`,
|
|
timestamp: new Date(),
|
|
color: config.colors.success as any,
|
|
footer: { iconURL: config.footer.icon, text: config.footer.text },
|
|
};
|
|
|
|
// Send interaction reply
|
|
await interaction.editReply({ embeds: [embed] });
|
|
|
|
// Send debug message
|
|
await logger.debug(
|
|
`Guild: ${interaction?.guild?.id} User: ${interaction?.user?.id} has given ${target?.id} a ${type} reputation.`
|
|
);
|
|
|
|
// Create a timeout for the user
|
|
await timeouts.create({
|
|
guildId: interaction?.guild?.id,
|
|
userId: interaction?.user?.id,
|
|
timeoutId: 2,
|
|
});
|
|
});
|
|
|
|
setTimeout(async () => {
|
|
// send debug message
|
|
await logger.debug(
|
|
`Guild: ${interaction?.guild?.id} User: ${
|
|
interaction?.user?.id
|
|
} has not repute within last ${
|
|
config.reputation.timeout / 1000
|
|
} seconds, reputation can be given`
|
|
);
|
|
|
|
// When timeout is out, remove it from the database
|
|
await timeouts.deleteOne({
|
|
guildId: interaction?.guild?.id,
|
|
userId: interaction?.user?.id,
|
|
timeoutId: 2,
|
|
});
|
|
}, config.reputation.timeout);
|
|
} else {
|
|
// Create embed object
|
|
const embed = {
|
|
title: ':loudspeaker: Reputation - Give',
|
|
description: `You have given reputation within the last ${
|
|
config.reputation.timeout / 1000
|
|
} seconds, you can not repute now!`,
|
|
timestamp: new Date(),
|
|
color: config.colors.error as any,
|
|
footer: { iconURL: config.footer.icon, text: config.footer.text },
|
|
};
|
|
|
|
// Send interaction reply
|
|
await interaction.editReply({ embeds: [embed] });
|
|
|
|
// Send debug message
|
|
await logger.debug(
|
|
`Guild: ${interaction?.guild?.id} User: ${
|
|
interaction?.user?.id
|
|
} has repute within last ${
|
|
config.reputation.timeout / 1000
|
|
} seconds, no reputation can be given`
|
|
);
|
|
}
|
|
};
|