180 lines
5.2 KiB
TypeScript
180 lines
5.2 KiB
TypeScript
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
|
||
import { ChannelType } from "discord-api-types/v10";
|
||
import {
|
||
ChatInputCommandInteraction,
|
||
EmbedBuilder,
|
||
PermissionsBitField,
|
||
} from "discord.js";
|
||
import getEmbedConfig from "../../../../helpers/getEmbedData";
|
||
import logger from "../../../../middlewares/logger";
|
||
import guildSchema from "../../../../models/guild";
|
||
|
||
export default {
|
||
metadata: {
|
||
guildOnly: true,
|
||
ephemeral: true,
|
||
permissions: [PermissionsBitField.Flags.ManageGuild],
|
||
},
|
||
|
||
builder: (command: SlashCommandSubcommandBuilder) => {
|
||
return command
|
||
.setName("welcome")
|
||
.setDescription("Welcome")
|
||
.addBooleanOption((option) =>
|
||
option.setName("status").setDescription("Should welcome be enabled?")
|
||
)
|
||
.addChannelOption((option) =>
|
||
option
|
||
.setName("join-channel")
|
||
.setDescription("Channel for join messages.")
|
||
.addChannelTypes(ChannelType.GuildText)
|
||
)
|
||
|
||
.addChannelOption((option) =>
|
||
option
|
||
.setName("leave-channel")
|
||
.setDescription("Channel for leave messages.")
|
||
.addChannelTypes(ChannelType.GuildText)
|
||
)
|
||
|
||
.addStringOption((option) =>
|
||
option
|
||
.setName("leave-message")
|
||
.setDescription("Message for leave messages.")
|
||
)
|
||
.addStringOption((option) =>
|
||
option
|
||
.setName("join-message")
|
||
.setDescription("Message for join messages.")
|
||
);
|
||
},
|
||
execute: async (interaction: ChatInputCommandInteraction) => {
|
||
const { successColor, footerText, footerIcon } = await getEmbedConfig(
|
||
interaction.guild
|
||
);
|
||
const { options, guild } = interaction;
|
||
|
||
const status = options?.getBoolean("status");
|
||
const joinChannel = options?.getChannel("join-channel");
|
||
const leaveChannel = options?.getChannel("leave-channel");
|
||
const joinChannelMessage = options?.getString("join-message");
|
||
const leaveChannelMessage = options?.getString("leave-message");
|
||
|
||
const guildDB = await guildSchema?.findOne({
|
||
guildId: guild?.id,
|
||
});
|
||
|
||
if (guildDB === null) {
|
||
return logger?.silly(`Guild not found in database.`);
|
||
}
|
||
|
||
guildDB.welcome.status =
|
||
status !== null ? status : guildDB?.welcome?.status;
|
||
guildDB.welcome.joinChannel =
|
||
joinChannel !== null ? joinChannel.id : guildDB?.welcome?.joinChannel;
|
||
guildDB.welcome.leaveChannel =
|
||
leaveChannel !== null ? leaveChannel.id : guildDB?.welcome?.leaveChannel;
|
||
|
||
guildDB.welcome.joinChannelMessage =
|
||
joinChannelMessage !== null
|
||
? joinChannelMessage
|
||
: guildDB?.welcome?.joinChannelMessage;
|
||
guildDB.welcome.leaveChannelMessage =
|
||
leaveChannelMessage !== null
|
||
? leaveChannelMessage
|
||
: guildDB?.welcome?.leaveChannelMessage;
|
||
|
||
await guildDB?.save()?.then(async () => {
|
||
logger?.silly(`Guild welcome updated.`);
|
||
|
||
const interactionEmbedDisabled = new EmbedBuilder()
|
||
.setTitle("[:tools:] Welcome")
|
||
.setDescription(
|
||
"This module is currently disabled, please enable it to continue."
|
||
)
|
||
.setColor(successColor)
|
||
.addFields(
|
||
{
|
||
name: "🤖 Status",
|
||
value: `${guildDB?.points?.status}`,
|
||
inline: true,
|
||
},
|
||
{
|
||
name: "📈 Rate",
|
||
value: `${guildDB?.points?.rate}`,
|
||
inline: true,
|
||
},
|
||
{
|
||
name: "🔨 Minimum Length",
|
||
value: `${guildDB?.points?.minimumLength}`,
|
||
inline: true,
|
||
},
|
||
{
|
||
name: "⏰ Timeout",
|
||
value: `${guildDB?.points?.timeout}`,
|
||
inline: true,
|
||
}
|
||
)
|
||
.setTimestamp()
|
||
.setFooter({
|
||
iconURL: footerIcon,
|
||
text: footerText,
|
||
});
|
||
|
||
if (!guildDB?.welcome?.status) {
|
||
return interaction?.editReply({
|
||
embeds: [interactionEmbedDisabled],
|
||
});
|
||
}
|
||
|
||
const interactionEmbed = new EmbedBuilder()
|
||
.setTitle("[:tools:] Welcome")
|
||
.setDescription(
|
||
`The following configuration will be used.
|
||
|
||
[👋] **Welcome**
|
||
|
||
ㅤ**Channel**: <#${guildDB?.welcome?.joinChannel}>
|
||
ㅤ**Message**: ${guildDB?.welcome?.joinChannelMessage}
|
||
|
||
[🚪] **Leave**
|
||
|
||
ㅤ**Channel**: <#${guildDB?.welcome?.leaveChannel}>
|
||
ㅤ**Message**: ${guildDB?.welcome?.leaveChannelMessage}`
|
||
)
|
||
.setColor(successColor)
|
||
.addFields(
|
||
{
|
||
name: "🤖 Status",
|
||
value: `${guildDB?.points?.status}`,
|
||
inline: true,
|
||
},
|
||
{
|
||
name: "📈 Rate",
|
||
value: `${guildDB?.points?.rate}`,
|
||
inline: true,
|
||
},
|
||
{
|
||
name: "🔨 Minimum Length",
|
||
value: `${guildDB?.points?.minimumLength}`,
|
||
inline: true,
|
||
},
|
||
{
|
||
name: "⏰ Timeout",
|
||
value: `${guildDB?.points?.timeout}`,
|
||
inline: true,
|
||
}
|
||
)
|
||
.setTimestamp()
|
||
.setFooter({
|
||
iconURL: footerIcon,
|
||
text: footerText,
|
||
});
|
||
|
||
await interaction?.editReply({
|
||
embeds: [interactionEmbed],
|
||
});
|
||
return;
|
||
});
|
||
},
|
||
};
|