generated from Baipyrus/DiscordJS-Template
Compare commits
7 Commits
4bd3e83add
...
30f3a97cc3
Author | SHA1 | Date | |
---|---|---|---|
30f3a97cc3 | |||
08567747c7 | |||
663f1313e9 | |||
9091e1c023 | |||
db898a2a36 | |||
d9952d79e9 | |||
d7c26f7bee |
@ -4,7 +4,7 @@ import {
|
|||||||
SlashCommandBuilder,
|
SlashCommandBuilder,
|
||||||
ChatInputCommandInteraction
|
ChatInputCommandInteraction
|
||||||
} from 'discord.js';
|
} from 'discord.js';
|
||||||
import { Guild, VoiceChannel } from '../../../database.js';
|
import { Guilds, VoiceChannels } from '../../../database.js';
|
||||||
|
|
||||||
export const data = new SlashCommandBuilder()
|
export const data = new SlashCommandBuilder()
|
||||||
.setName('custom_vc')
|
.setName('custom_vc')
|
||||||
@ -68,12 +68,12 @@ export async function execute(interaction) {
|
|||||||
|
|
||||||
step = 'save';
|
step = 'save';
|
||||||
// Create guild if not exists
|
// Create guild if not exists
|
||||||
await Guild.findOrCreate({
|
await Guilds.findOrCreate({
|
||||||
where: guildData,
|
where: guildData,
|
||||||
defaults: guildData
|
defaults: guildData
|
||||||
});
|
});
|
||||||
// Save channel data
|
// Save channel data
|
||||||
await VoiceChannel.create({
|
await VoiceChannels.create({
|
||||||
id: channel.id,
|
id: channel.id,
|
||||||
guild: guild.id,
|
guild: guild.id,
|
||||||
create: true
|
create: true
|
||||||
@ -94,12 +94,12 @@ export async function execute(interaction) {
|
|||||||
|
|
||||||
step = 'save';
|
step = 'save';
|
||||||
// Create guild if not exists
|
// Create guild if not exists
|
||||||
await Guild.findOrCreate({
|
await Guilds.findOrCreate({
|
||||||
where: guildData,
|
where: guildData,
|
||||||
defaults: guildData
|
defaults: guildData
|
||||||
});
|
});
|
||||||
// Save channel data
|
// Save channel data
|
||||||
await VoiceChannel.create({
|
await VoiceChannels.create({
|
||||||
id,
|
id,
|
||||||
guild: guild.id,
|
guild: guild.id,
|
||||||
create: true
|
create: true
|
||||||
@ -120,7 +120,7 @@ export async function execute(interaction) {
|
|||||||
|
|
||||||
// Remove channel from guild
|
// Remove channel from guild
|
||||||
step = 'remove';
|
step = 'remove';
|
||||||
const count = await VoiceChannel.destroy({
|
const count = await VoiceChannels.destroy({
|
||||||
where: {
|
where: {
|
||||||
id,
|
id,
|
||||||
create: true
|
create: true
|
@ -1,20 +1,20 @@
|
|||||||
import { SlashCommandBuilder, PermissionFlagsBits, ChatInputCommandInteraction } from 'discord.js';
|
import { SlashCommandBuilder, PermissionFlagsBits, ChatInputCommandInteraction } from 'discord.js';
|
||||||
import { Role, Guild } from '../../../database.js';
|
import { Roles, Guilds } from '../../../database.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Guild} guild
|
* @param {Guilds} guild
|
||||||
* @param {Role} role
|
* @param {Roles} role
|
||||||
*/
|
*/
|
||||||
const registerRole = async (guild, role) => {
|
const registerRole = async (guild, role) => {
|
||||||
// Check if guild exists in database, otherwise create it
|
// Check if guild exists in database, otherwise create it
|
||||||
const guildData = { id: guild.id };
|
const guildData = { id: guild.id };
|
||||||
await Guild.findOrCreate({
|
await Guilds.findOrCreate({
|
||||||
where: guildData,
|
where: guildData,
|
||||||
defaults: guildData
|
defaults: guildData
|
||||||
});
|
});
|
||||||
|
|
||||||
// Register role in database
|
// Register role in database
|
||||||
await Role.create({
|
await Roles.create({
|
||||||
guild: guild.id,
|
guild: guild.id,
|
||||||
id: role.id,
|
id: role.id,
|
||||||
assign: true
|
assign: true
|
||||||
@ -57,18 +57,20 @@ export async function execute(interaction) {
|
|||||||
switch (options.getSubcommand()) {
|
switch (options.getSubcommand()) {
|
||||||
case 'add': {
|
case 'add': {
|
||||||
// Search for role in database
|
// Search for role in database
|
||||||
const found = await Role.findOne({
|
/** @type {import('../../../models/roles.js').Role|null} */
|
||||||
|
const found = await Roles.findOne({
|
||||||
where: {
|
where: {
|
||||||
id: role.id
|
id: role.id
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Toggle role assignment if found
|
// Toggle role assignment if found
|
||||||
if (found) {
|
if (found !== null) {
|
||||||
found.assign = true;
|
found.assign = true;
|
||||||
await found.save();
|
await found.save();
|
||||||
// Otherwise create new database entry
|
// Otherwise create new database entry
|
||||||
} else await registerRole(interaction.guild, role);
|
} else await registerRole(interaction.guild, role);
|
||||||
|
|
||||||
// Reply successfully to acknowledge command
|
// Reply successfully to acknowledge command
|
||||||
await interaction.reply({
|
await interaction.reply({
|
||||||
content: 'Successfully registered role.',
|
content: 'Successfully registered role.',
|
||||||
@ -80,7 +82,7 @@ export async function execute(interaction) {
|
|||||||
}
|
}
|
||||||
case 'remove': {
|
case 'remove': {
|
||||||
// Remove role from database
|
// Remove role from database
|
||||||
const count = await Role.destroy({
|
const count = await Roles.destroy({
|
||||||
where: {
|
where: {
|
||||||
id: role.id,
|
id: role.id,
|
||||||
assign: true
|
assign: true
|
@ -1,139 +1,139 @@
|
|||||||
import {
|
import {
|
||||||
SlashCommandBuilder,
|
SlashCommandBuilder,
|
||||||
PermissionFlagsBits,
|
PermissionFlagsBits,
|
||||||
ModalSubmitInteraction,
|
ModalSubmitInteraction,
|
||||||
AutocompleteInteraction,
|
AutocompleteInteraction,
|
||||||
ChatInputCommandInteraction
|
ChatInputCommandInteraction
|
||||||
} from 'discord.js';
|
} from 'discord.js';
|
||||||
|
|
||||||
/** @param {ChatInputCommandInteraction} interaction */
|
/** @param {ChatInputCommandInteraction} interaction */
|
||||||
async function createResponse(interaction) {}
|
async function createResponse(interaction) {}
|
||||||
|
|
||||||
/** @param {ChatInputCommandInteraction} interaction */
|
/** @param {ChatInputCommandInteraction} interaction */
|
||||||
async function addResponse(interaction) {}
|
async function addResponse(interaction) {}
|
||||||
|
|
||||||
/** @param {ChatInputCommandInteraction} interaction */
|
/** @param {ChatInputCommandInteraction} interaction */
|
||||||
async function removeResponse(interaction) {}
|
async function removeResponse(interaction) {}
|
||||||
|
|
||||||
/** @param {ChatInputCommandInteraction} interaction */
|
/** @param {ChatInputCommandInteraction} interaction */
|
||||||
async function listResponse(interaction) {}
|
async function listResponse(interaction) {}
|
||||||
|
|
||||||
/** @param {ChatInputCommandInteraction} interaction */
|
/** @param {ChatInputCommandInteraction} interaction */
|
||||||
async function infoResponse(interaction) {}
|
async function infoResponse(interaction) {}
|
||||||
|
|
||||||
/** @param {AutocompleteInteraction} interaction */
|
/** @param {AutocompleteInteraction} interaction */
|
||||||
async function addAutocomplete(interaction) {}
|
async function addAutocomplete(interaction) {}
|
||||||
|
|
||||||
/** @param {AutocompleteInteraction} interaction */
|
/** @param {AutocompleteInteraction} interaction */
|
||||||
async function removeAutocomplete(interaction) {}
|
async function removeAutocomplete(interaction) {}
|
||||||
|
|
||||||
/** @param {AutocompleteInteraction} interaction */
|
/** @param {AutocompleteInteraction} interaction */
|
||||||
async function infoAutocomplete(interaction) {}
|
async function infoAutocomplete(interaction) {}
|
||||||
|
|
||||||
export const data = new SlashCommandBuilder()
|
export const data = new SlashCommandBuilder()
|
||||||
.setName('response')
|
.setName('response')
|
||||||
.setDMPermission(false)
|
.setDMPermission(false)
|
||||||
.setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages)
|
.setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages)
|
||||||
.setDescription('Event based responses to specific messages with keywords.')
|
.setDescription('Event based responses to specific messages with keywords.')
|
||||||
.addSubcommand((subcommand) =>
|
.addSubcommand((subcommand) =>
|
||||||
subcommand
|
subcommand
|
||||||
.setName('create')
|
.setName('create')
|
||||||
.setDescription('Creates a new event based response.')
|
.setDescription('Creates a new event based response.')
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
option
|
option
|
||||||
.setName('keyword')
|
.setName('keyword')
|
||||||
.setDescription('The keyword to trigger the response.')
|
.setDescription('The keyword to trigger the response.')
|
||||||
.setRequired(true)
|
.setRequired(true)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.addSubcommand((subcommand) =>
|
.addSubcommand((subcommand) =>
|
||||||
subcommand
|
subcommand
|
||||||
.setName('add')
|
.setName('add')
|
||||||
.setDescription('Registers a response to a keyword.')
|
.setDescription('Registers a response to a keyword.')
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
option
|
option
|
||||||
.setName('keyword')
|
.setName('keyword')
|
||||||
.setDescription('The keyword to trigger the response.')
|
.setDescription('The keyword to trigger the response.')
|
||||||
.setAutocomplete(true)
|
.setAutocomplete(true)
|
||||||
.setRequired(true)
|
.setRequired(true)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.addSubcommand((subcommand) =>
|
.addSubcommand((subcommand) =>
|
||||||
subcommand
|
subcommand
|
||||||
.setName('remove')
|
.setName('remove')
|
||||||
.setDescription('Unregisters a response to a keyword.')
|
.setDescription('Unregisters a response to a keyword.')
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
option
|
option
|
||||||
.setName('type')
|
.setName('type')
|
||||||
.setDescription('The type of data to be removed.')
|
.setDescription('The type of data to be removed.')
|
||||||
.setRequired(true)
|
.setRequired(true)
|
||||||
.addChoices(
|
.addChoices(
|
||||||
{ name: 'Keyword', value: 'keyword' },
|
{ name: 'Keyword', value: 'keyword' },
|
||||||
{ name: 'Response', value: 'response' }
|
{ name: 'Response', value: 'response' }
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
option
|
option
|
||||||
.setName('name')
|
.setName('name')
|
||||||
.setDescription('The name of the data to be removed.')
|
.setDescription('The name of the data to be removed.')
|
||||||
.setAutocomplete(true)
|
.setAutocomplete(true)
|
||||||
.setRequired(true)
|
.setRequired(true)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.addSubcommand((subcommand) =>
|
.addSubcommand((subcommand) =>
|
||||||
subcommand.setName('list').setDescription('Lists all registered keywords.')
|
subcommand.setName('list').setDescription('Lists all registered keywords.')
|
||||||
)
|
)
|
||||||
.addSubcommand((subcommand) =>
|
.addSubcommand((subcommand) =>
|
||||||
subcommand
|
subcommand
|
||||||
.setName('info')
|
.setName('info')
|
||||||
.setDescription('Shows information about a registered keyword.')
|
.setDescription('Shows information about a registered keyword.')
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
option
|
option
|
||||||
.setName('keyword')
|
.setName('keyword')
|
||||||
.setDescription('The keyword to show the details of.')
|
.setDescription('The keyword to show the details of.')
|
||||||
.setAutocomplete(true)
|
.setAutocomplete(true)
|
||||||
.setRequired(true)
|
.setRequired(true)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
/** @param {ModalSubmitInteraction} interaction */
|
/** @param {ModalSubmitInteraction} interaction */
|
||||||
export async function modalSubmit(interaction) {
|
export async function modalSubmit(interaction) {
|
||||||
// Only executable in 'add' subcommand
|
// Only executable in 'add' subcommand
|
||||||
}
|
}
|
||||||
/** @param {AutocompleteInteraction} interaction */
|
/** @param {AutocompleteInteraction} interaction */
|
||||||
export async function autocomplete(interaction) {
|
export async function autocomplete(interaction) {
|
||||||
const { options } = interaction;
|
const { options } = interaction;
|
||||||
|
|
||||||
switch (options.getSubcommand()) {
|
switch (options.getSubcommand()) {
|
||||||
case 'add':
|
case 'add':
|
||||||
addAutocomplete(interaction);
|
addAutocomplete(interaction);
|
||||||
break;
|
break;
|
||||||
case 'remove':
|
case 'remove':
|
||||||
removeAutocomplete(interaction);
|
removeAutocomplete(interaction);
|
||||||
break;
|
break;
|
||||||
case 'info':
|
case 'info':
|
||||||
infoAutocomplete(interaction);
|
infoAutocomplete(interaction);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/** @param {ChatInputCommandInteraction} interaction */
|
/** @param {ChatInputCommandInteraction} interaction */
|
||||||
export async function execute(interaction) {
|
export async function execute(interaction) {
|
||||||
const { options } = interaction;
|
const { options } = interaction;
|
||||||
|
|
||||||
switch (options.getSubcommand()) {
|
switch (options.getSubcommand()) {
|
||||||
case 'create':
|
case 'create':
|
||||||
createResponse(interaction);
|
createResponse(interaction);
|
||||||
break;
|
break;
|
||||||
case 'add':
|
case 'add':
|
||||||
addResponse(interaction);
|
addResponse(interaction);
|
||||||
break;
|
break;
|
||||||
case 'remove':
|
case 'remove':
|
||||||
removeResponse(interaction);
|
removeResponse(interaction);
|
||||||
break;
|
break;
|
||||||
case 'list':
|
case 'list':
|
||||||
listResponse(interaction);
|
listResponse(interaction);
|
||||||
break;
|
break;
|
||||||
case 'info':
|
case 'info':
|
||||||
infoResponse(interaction);
|
infoResponse(interaction);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,7 +4,7 @@ import {
|
|||||||
PermissionFlagsBits,
|
PermissionFlagsBits,
|
||||||
ContextMenuCommandInteraction
|
ContextMenuCommandInteraction
|
||||||
} from 'discord.js';
|
} from 'discord.js';
|
||||||
import { Message } from '../../../../database.js';
|
import { Messages } from '../../../../database.js';
|
||||||
|
|
||||||
export const data = new ContextMenuCommandBuilder()
|
export const data = new ContextMenuCommandBuilder()
|
||||||
.setDMPermission(false)
|
.setDMPermission(false)
|
||||||
@ -17,7 +17,7 @@ export async function execute(interaction) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Create database entry
|
// Create database entry
|
||||||
await Message.create({ id });
|
await Messages.create({ id });
|
||||||
|
|
||||||
// Reply successfully to acknowledge command
|
// Reply successfully to acknowledge command
|
||||||
await interaction.reply({
|
await interaction.reply({
|
@ -1,6 +1,6 @@
|
|||||||
import { PermissionFlagsBits, SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js';
|
import { PermissionFlagsBits, SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js';
|
||||||
import { addSelfRoles, removeSelfRoles } from '../../../shared.js';
|
import { addSelfRoles, removeSelfRoles } from '../../../shared.js';
|
||||||
import { Guild, Message } from '../../../database.js';
|
import { Guilds, Messages } from '../../../database.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a `Message` in the current channel and registers for self roles.
|
* Sends a `Message` in the current channel and registers for self roles.
|
||||||
@ -48,11 +48,12 @@ const registerSelfRoles = async (interaction) => {
|
|||||||
await channel.messages.fetch(id);
|
await channel.messages.fetch(id);
|
||||||
|
|
||||||
// Check if message is already registered
|
// Check if message is already registered
|
||||||
const found = await Message.findOne({
|
/** @type {import('../../../models/messages.js').Message|null} */
|
||||||
|
const found = await Messages.findOne({
|
||||||
where: { id }
|
where: { id }
|
||||||
});
|
});
|
||||||
|
|
||||||
if (found) throw new Error('Message already registered!');
|
if (found !== null) throw new Error('Messages already registered!');
|
||||||
|
|
||||||
// Reply successfully to acknowledge command
|
// Reply successfully to acknowledge command
|
||||||
await interaction.reply({
|
await interaction.reply({
|
||||||
@ -196,13 +197,13 @@ export async function execute(interaction) {
|
|||||||
try {
|
try {
|
||||||
// Create guild if not exists
|
// Create guild if not exists
|
||||||
const guildData = { id: interaction.guild.id };
|
const guildData = { id: interaction.guild.id };
|
||||||
await Guild.findOrCreate({
|
await Guilds.findOrCreate({
|
||||||
where: guildData,
|
where: guildData,
|
||||||
defaults: guildData
|
defaults: guildData
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create database entry
|
// Create database entry
|
||||||
await Message.create({
|
await Messages.create({
|
||||||
id,
|
id,
|
||||||
guild: interaction.guild.id
|
guild: interaction.guild.id
|
||||||
});
|
});
|
30
database.js
30
database.js
@ -18,26 +18,26 @@ const sequelize = new Sequelize({
|
|||||||
logging: false
|
logging: false
|
||||||
});
|
});
|
||||||
|
|
||||||
const Response = defineResponse(sequelize);
|
const Responses = defineResponse(sequelize);
|
||||||
|
|
||||||
const Keyword = defineKeyword(sequelize);
|
const Keywords = defineKeyword(sequelize);
|
||||||
Keyword.hasMany(Response, { foreignKey: 'keyword', onDelete: 'CASCADE' });
|
Keywords.hasMany(Responses, { foreignKey: 'keyword', onDelete: 'CASCADE' });
|
||||||
|
|
||||||
const RoleEmojiPair = defineRoleEmojiPair(sequelize);
|
const RoleEmojiPairs = defineRoleEmojiPair(sequelize);
|
||||||
|
|
||||||
const VoiceChannel = defineVoiceChannel(sequelize);
|
const VoiceChannels = defineVoiceChannel(sequelize);
|
||||||
|
|
||||||
const Message = defineMessage(sequelize);
|
const Messages = defineMessage(sequelize);
|
||||||
Message.hasMany(RoleEmojiPair, { foreignKey: 'message', onDelete: 'CASCADE' });
|
Messages.hasMany(RoleEmojiPairs, { foreignKey: 'message', onDelete: 'CASCADE' });
|
||||||
|
|
||||||
const Role = defineRole(sequelize);
|
const Roles = defineRole(sequelize);
|
||||||
Role.hasMany(RoleEmojiPair, { foreignKey: 'role', onDelete: 'CASCADE' });
|
Roles.hasMany(RoleEmojiPairs, { foreignKey: 'role', onDelete: 'CASCADE' });
|
||||||
|
|
||||||
const Guild = defineGuild(sequelize);
|
const Guilds = defineGuild(sequelize);
|
||||||
Guild.hasMany(Keyword, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
Guilds.hasMany(Keywords, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
||||||
Guild.hasMany(VoiceChannel, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
Guilds.hasMany(VoiceChannels, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
||||||
Guild.hasMany(Message, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
Guilds.hasMany(Messages, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
||||||
Guild.hasMany(Role, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
Guilds.hasMany(Roles, { foreignKey: 'guild', onDelete: 'CASCADE' });
|
||||||
|
|
||||||
sequelize.sync();
|
sequelize.sync();
|
||||||
export { sequelize, Guild, Role, RoleEmojiPair, VoiceChannel, Message };
|
export { sequelize, Guilds, Roles, Messages, VoiceChannels, RoleEmojiPairs, Keywords, Responses };
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { ChannelType, Events, GuildChannel } from 'discord.js';
|
import { ChannelType, Events, GuildChannel } from 'discord.js';
|
||||||
import { VoiceChannel } from '../../database.js';
|
import { VoiceChannels } from '../../database.js';
|
||||||
|
|
||||||
export const name = Events.ChannelDelete;
|
export const name = Events.ChannelDelete;
|
||||||
/** @param {GuildChannel} channel */
|
/** @param {GuildChannel} channel */
|
||||||
@ -7,7 +7,7 @@ export async function execute(channel) {
|
|||||||
if (channel.type !== ChannelType.GuildVoice) return;
|
if (channel.type !== ChannelType.GuildVoice) return;
|
||||||
|
|
||||||
// Delete channel entry once channel is deleted itself
|
// Delete channel entry once channel is deleted itself
|
||||||
const count = await VoiceChannel.destroy({
|
const count = await VoiceChannels.destroy({
|
||||||
where: {
|
where: {
|
||||||
id: channel.id
|
id: channel.id
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import {
|
|||||||
VoiceState,
|
VoiceState,
|
||||||
PermissionsBitField
|
PermissionsBitField
|
||||||
} from 'discord.js';
|
} from 'discord.js';
|
||||||
import { VoiceChannel } from '../../database.js';
|
import { VoiceChannels } from '../../database.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function that either creates a new custom channel or gets an existing one registered in the database.
|
* Function that either creates a new custom channel or gets an existing one registered in the database.
|
||||||
@ -18,7 +18,8 @@ import { VoiceChannel } from '../../database.js';
|
|||||||
*/
|
*/
|
||||||
const getChannel = async (member, guildChs, channel) => {
|
const getChannel = async (member, guildChs, channel) => {
|
||||||
// Check database for existing channel
|
// Check database for existing channel
|
||||||
const ownCh = await VoiceChannel.findOne({
|
/** @type {import('../../models/voiceChannels.js').VoiceChannel|null} */
|
||||||
|
const ownCh = await VoiceChannels.findOne({
|
||||||
where: {
|
where: {
|
||||||
owner: member.id
|
owner: member.id
|
||||||
}
|
}
|
||||||
@ -35,7 +36,7 @@ const getChannel = async (member, guildChs, channel) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Save newly created channel
|
// Save newly created channel
|
||||||
await VoiceChannel.create({
|
await VoiceChannels.create({
|
||||||
id: privCh.id,
|
id: privCh.id,
|
||||||
owner: member.id
|
owner: member.id
|
||||||
});
|
});
|
||||||
@ -58,7 +59,8 @@ const leftVoiceChat = async (state) => {
|
|||||||
if (members.length > 0) return;
|
if (members.length > 0) return;
|
||||||
|
|
||||||
// Find channel by id, return if not registered as custom
|
// Find channel by id, return if not registered as custom
|
||||||
const custom = await VoiceChannel.findOne({
|
/** @type {import('../../models/voiceChannels.js').VoiceChannel|null} */
|
||||||
|
const custom = await VoiceChannels.findOne({
|
||||||
where: {
|
where: {
|
||||||
id: channel.id,
|
id: channel.id,
|
||||||
create: false
|
create: false
|
||||||
@ -84,7 +86,8 @@ export async function execute(oldState, newState) {
|
|||||||
if (!channel) return;
|
if (!channel) return;
|
||||||
|
|
||||||
// Find channel by id, return if not registered for customs
|
// Find channel by id, return if not registered for customs
|
||||||
const createCh = await VoiceChannel.findOne({
|
/** @type {import('../../models/voiceChannels.js').VoiceChannel|null} */
|
||||||
|
const createCh = await VoiceChannels.findOne({
|
||||||
where: {
|
where: {
|
||||||
id: channel.id,
|
id: channel.id,
|
||||||
create: true
|
create: true
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
import { Events, GuildMember } from 'discord.js';
|
import { Events, GuildMember } from 'discord.js';
|
||||||
import { Role } from '../../database.js';
|
import { Roles } from '../../database.js';
|
||||||
|
|
||||||
export const name = Events.GuildMemberAdd;
|
export const name = Events.GuildMemberAdd;
|
||||||
/** @param {GuildMember} member */
|
/** @param {GuildMember} member */
|
||||||
export async function execute(member) {
|
export async function execute(member) {
|
||||||
// Find roles to be assigned in guild from database
|
// Find roles to be assigned in guild from database
|
||||||
const roles = await Role.findAll({
|
/** @type {import('../../models/roles.js').Role[]} */
|
||||||
|
const roles = await Roles.findAll({
|
||||||
where: {
|
where: {
|
||||||
guild: member.guild.id,
|
guild: member.guild.id,
|
||||||
assign: true
|
assign: true
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { Message } from '../../database.js';
|
import { Messages } from '../../database.js';
|
||||||
import { Events } from 'discord.js';
|
import { Events } from 'discord.js';
|
||||||
|
|
||||||
export const name = Events.MessageDelete;
|
export const name = Events.MessageDelete;
|
||||||
/** @param {import('discord.js').Message} message */
|
/** @param {import('discord.js').Message} message */
|
||||||
export async function execute(message) {
|
export async function execute(message) {
|
||||||
// Delete message entry once message is deleted itself
|
// Delete message entry once message is deleted itself
|
||||||
const count = await Message.destroy({
|
const count = await Messages.destroy({
|
||||||
where: {
|
where: {
|
||||||
id: message.id
|
id: message.id
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Events, MessageReaction, User } from 'discord.js';
|
import { Events, MessageReaction, User } from 'discord.js';
|
||||||
import { Message, RoleEmojiPair } from '../../database.js';
|
import { Messages, RoleEmojiPairs } from '../../database.js';
|
||||||
import { config } from 'dotenv';
|
import { config } from 'dotenv';
|
||||||
|
|
||||||
config();
|
config();
|
||||||
@ -14,7 +14,8 @@ export async function execute(reaction, user) {
|
|||||||
|
|
||||||
// Get message
|
// Get message
|
||||||
const msgID = reaction.message.id;
|
const msgID = reaction.message.id;
|
||||||
const message = await Message.findOne({
|
/** @type {import('../../models/messages.js').Message|null} */
|
||||||
|
const message = await Messages.findOne({
|
||||||
where: {
|
where: {
|
||||||
id: msgID
|
id: msgID
|
||||||
}
|
}
|
||||||
@ -24,7 +25,8 @@ export async function execute(reaction, user) {
|
|||||||
|
|
||||||
// Get emoji
|
// Get emoji
|
||||||
const emoji = reaction.emoji.toString();
|
const emoji = reaction.emoji.toString();
|
||||||
const rep = await RoleEmojiPair.findOne({
|
/** @type {import('../../models/roleEmojiPairs.js').RoleEmojiPair|null} */
|
||||||
|
const rep = await RoleEmojiPairs.findOne({
|
||||||
where: {
|
where: {
|
||||||
message: msgID,
|
message: msgID,
|
||||||
emoji
|
emoji
|
||||||
@ -34,7 +36,7 @@ export async function execute(reaction, user) {
|
|||||||
if (rep === null) {
|
if (rep === null) {
|
||||||
// Remove reaction and quit
|
// Remove reaction and quit
|
||||||
try {
|
try {
|
||||||
reaction.remove();
|
await reaction.remove();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Missing permissions
|
// Missing permissions
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Events, MessageReaction, User } from 'discord.js';
|
import { Events, MessageReaction, User } from 'discord.js';
|
||||||
import { Message, RoleEmojiPair } from '../../database.js';
|
import { Messages, RoleEmojiPairs } from '../../database.js';
|
||||||
import { config } from 'dotenv';
|
import { config } from 'dotenv';
|
||||||
|
|
||||||
config();
|
config();
|
||||||
@ -14,7 +14,8 @@ export async function execute(reaction, user) {
|
|||||||
|
|
||||||
// Get message
|
// Get message
|
||||||
const msgID = reaction.message.id;
|
const msgID = reaction.message.id;
|
||||||
const message = await Message.findOne({
|
/** @type {import('../../models/messages.js').Message|null} */
|
||||||
|
const message = await Messages.findOne({
|
||||||
where: {
|
where: {
|
||||||
id: msgID
|
id: msgID
|
||||||
}
|
}
|
||||||
@ -24,7 +25,8 @@ export async function execute(reaction, user) {
|
|||||||
|
|
||||||
// Get emoji
|
// Get emoji
|
||||||
const emoji = reaction.emoji.toString();
|
const emoji = reaction.emoji.toString();
|
||||||
const rep = await RoleEmojiPair.findOne({
|
/** @type {import('../../models/roleEmojiPairs.js').RoleEmojiPair|null} */
|
||||||
|
const rep = await RoleEmojiPairs.findOne({
|
||||||
where: {
|
where: {
|
||||||
message: msgID,
|
message: msgID,
|
||||||
emoji
|
emoji
|
||||||
|
@ -6,7 +6,7 @@ import { DataTypes, Sequelize } from 'sequelize';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The definition of the `Guild` table in the database.
|
* The definition of the `Guilds` table in the database.
|
||||||
* @param {Sequelize} sequelize
|
* @param {Sequelize} sequelize
|
||||||
*/
|
*/
|
||||||
export default function (sequelize) {
|
export default function (sequelize) {
|
||||||
|
@ -7,7 +7,7 @@ import { DataTypes, Deferrable, Sequelize } from 'sequelize';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The definition of the `Message` table in the database.
|
* The definition of the `Messages` table in the database.
|
||||||
* @param {Sequelize} sequelize
|
* @param {Sequelize} sequelize
|
||||||
*/
|
*/
|
||||||
export default function (sequelize) {
|
export default function (sequelize) {
|
||||||
|
@ -9,7 +9,7 @@ import { DataTypes, Deferrable, Sequelize } from 'sequelize';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The definition of the `RoleEmojiPair` table in the database.
|
* The definition of the `RoleEmojiPairs` table in the database.
|
||||||
* @param {Sequelize} sequelize
|
* @param {Sequelize} sequelize
|
||||||
*/
|
*/
|
||||||
export default function (sequelize) {
|
export default function (sequelize) {
|
||||||
|
@ -8,7 +8,7 @@ import { DataTypes, Deferrable, Sequelize } from 'sequelize';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The definition of the `Role` table in the database.
|
* The definition of the `Roles` table in the database.
|
||||||
* @param {Sequelize} sequelize
|
* @param {Sequelize} sequelize
|
||||||
*/
|
*/
|
||||||
export default function (sequelize) {
|
export default function (sequelize) {
|
||||||
|
@ -9,7 +9,7 @@ import { DataTypes, Deferrable, Sequelize } from 'sequelize';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The definition of the `VoiceChannel` table in the database.
|
* The definition of the `VoiceChannels` table in the database.
|
||||||
* @param {Sequelize} sequelize
|
* @param {Sequelize} sequelize
|
||||||
*/
|
*/
|
||||||
export default function (sequelize) {
|
export default function (sequelize) {
|
||||||
|
16
package-lock.json
generated
16
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "discord-bot",
|
"name": "discord-bot",
|
||||||
"version": "0.2.0",
|
"version": "0.3.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "discord-bot",
|
"name": "discord-bot",
|
||||||
"version": "0.2.0",
|
"version": "0.3.0",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"discord.js": "^14.14.1",
|
"discord.js": "^14.14.1",
|
||||||
@ -1424,6 +1424,12 @@
|
|||||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
||||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
||||||
},
|
},
|
||||||
|
"node_modules/ip": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"node_modules/is-builtin-module": {
|
"node_modules/is-builtin-module": {
|
||||||
"version": "3.2.1",
|
"version": "3.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
|
||||||
@ -2476,12 +2482,6 @@
|
|||||||
"npm": ">= 3.0.0"
|
"npm": ">= 3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/socks/node_modules/ip": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"node_modules/spdx-exceptions": {
|
"node_modules/spdx-exceptions": {
|
||||||
"version": "2.4.0",
|
"version": "2.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz",
|
||||||
|
19
shared.js
19
shared.js
@ -1,5 +1,5 @@
|
|||||||
import { ChatInputCommandInteraction, ContextMenuCommandInteraction, Role } from 'discord.js';
|
import { ChatInputCommandInteraction, ContextMenuCommandInteraction, Role } from 'discord.js';
|
||||||
import { Message, RoleEmojiPair, Guild } from './database.js';
|
import { Messages, RoleEmojiPairs, Guilds } from './database.js';
|
||||||
import { readdir } from 'fs/promises';
|
import { readdir } from 'fs/promises';
|
||||||
import { config } from 'dotenv';
|
import { config } from 'dotenv';
|
||||||
import { Op } from 'sequelize';
|
import { Op } from 'sequelize';
|
||||||
@ -15,7 +15,7 @@ config();
|
|||||||
*/
|
*/
|
||||||
export const removeSelfRoles = async (interaction, id) => {
|
export const removeSelfRoles = async (interaction, id) => {
|
||||||
// Try deleting message from database
|
// Try deleting message from database
|
||||||
const count = await Message.destroy({
|
const count = await Messages.destroy({
|
||||||
where: {
|
where: {
|
||||||
id: id
|
id: id
|
||||||
}
|
}
|
||||||
@ -35,18 +35,20 @@ export const removeSelfRoles = async (interaction, id) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to handle saving all the corresponding data for `Message` and `RoleEmojiPair` tables.
|
* Function to handle saving all the corresponding data for `Messages` and `RoleEmojiPairs` tables.
|
||||||
* @param {string} id A Discord message ID.
|
* @param {string} id A Discord message ID.
|
||||||
* @param {Role} role
|
* @param {Role} role
|
||||||
* @param {string} emoji Either a unicode emoji or a string representation in Discord custom emoji format.
|
* @param {string} emoji Either a unicode emoji or a string representation in Discord custom emoji format.
|
||||||
*/
|
*/
|
||||||
const saveMessageData = async (id, role, emoji) => {
|
const saveMessageData = async (id, role, emoji) => {
|
||||||
// Try finding message
|
// Try finding message
|
||||||
const msg = await Message.findOne({ where: { id } });
|
/** @type {import('./models/messages.js').Message|null} */
|
||||||
|
const msg = await Messages.findOne({ where: { id } });
|
||||||
if (msg === null) throw new Error(`No message with ID '${id}' could be found!`);
|
if (msg === null) throw new Error(`No message with ID '${id}' could be found!`);
|
||||||
|
|
||||||
// Try finding existing entry
|
// Try finding existing entry
|
||||||
const rep = await RoleEmojiPair.findOne({
|
/** @type {import('./models/roleEmojiPairs.js').RoleEmojiPair|null} */
|
||||||
|
const rep = await RoleEmojiPairs.findOne({
|
||||||
where: {
|
where: {
|
||||||
[Op.or]: [
|
[Op.or]: [
|
||||||
{
|
{
|
||||||
@ -67,13 +69,13 @@ const saveMessageData = async (id, role, emoji) => {
|
|||||||
|
|
||||||
// Create guild if not exists
|
// Create guild if not exists
|
||||||
const guildData = { id: role.guild.id };
|
const guildData = { id: role.guild.id };
|
||||||
await Guild.findOrCreate({
|
await Guilds.findOrCreate({
|
||||||
where: guildData,
|
where: guildData,
|
||||||
defaults: guildData
|
defaults: guildData
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create database entry for pair
|
// Create database entry for pair
|
||||||
await RoleEmojiPair.create({
|
await RoleEmojiPairs.create({
|
||||||
message: id,
|
message: id,
|
||||||
role: role.id,
|
role: role.id,
|
||||||
guild: guildData.id,
|
guild: guildData.id,
|
||||||
@ -92,7 +94,8 @@ const editMessage = async (message, role, emoji) => {
|
|||||||
|
|
||||||
// Find out whether to pad message or already present
|
// Find out whether to pad message or already present
|
||||||
let padding = '\n';
|
let padding = '\n';
|
||||||
const reps = await RoleEmojiPair.findAll({ where: { message: message.id } });
|
/** @type {import('./models/roleEmojiPairs.js').RoleEmojiPair[]} */
|
||||||
|
const reps = await RoleEmojiPairs.findAll({ where: { message: message.id } });
|
||||||
if (reps.length === 0) padding += '\n';
|
if (reps.length === 0) padding += '\n';
|
||||||
|
|
||||||
// Get old and build new content of message
|
// Get old and build new content of message
|
||||||
|
Loading…
Reference in New Issue
Block a user