Update purge.ts - In theory the buttons should work now (#37)

pull/38/head
Samuel Shuert 3 years ago committed by GitHub
commit 0345ba361f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -70,7 +70,7 @@ export async function callback(interaction: CommandInteraction | ButtonInteracti
if (!interaction.member) return; if (!interaction.member) return;
if (!interaction.guild) return; if (!interaction.guild) return;
const config = await client.database.guilds.read(interaction.guild.id); const config = await client.database.guilds.read(interaction.guild.id);
if (!config.roleMenu.enabled) if (!config.roleMenu.enabled) {
return await interaction.reply({ return await interaction.reply({
embeds: [ embeds: [
new EmojiEmbed() new EmojiEmbed()
@ -83,6 +83,7 @@ export async function callback(interaction: CommandInteraction | ButtonInteracti
], ],
ephemeral: true ephemeral: true
}); });
}
if (config.roleMenu.options.length === 0) if (config.roleMenu.options.length === 0)
return await interaction.reply({ return await interaction.reply({
embeds: [ embeds: [

@ -102,7 +102,7 @@ const callback = async (interaction: CommandInteraction): Promise<unknown> => {
try { try {
component = m.awaitMessageComponent({ component = m.awaitMessageComponent({
filter: (i) => filter: (i) =>
i.user.id === interaction.user.id && i.channel!.id === interaction.channel!.id && i.id === m.id, i.user.id === interaction.user.id && i.channel!.id === interaction.channel!.id,
time: 300000 time: 300000
}); });
} catch (e) { } catch (e) {

@ -23,7 +23,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
.setURL( .setURL(
`https://discord.com/api/oauth2/authorize?client_id=${ `https://discord.com/api/oauth2/authorize?client_id=${
client.user!.id client.user!.id
}&permissions=295157886134&scope=bot%20applications.commands` }&permissions=407900777662&scope=bot%20applications.commands`
) )
]) ])
], ],

@ -1,22 +1,182 @@
import type { CommandInteraction } from "discord.js"; import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, ChannelType, CommandInteraction, ComponentType, Guild, ModalBuilder, ModalSubmitInteraction, TextInputBuilder, TextInputStyle } from "discord.js";
import type { SlashCommandSubcommandBuilder } from "discord.js"; import type { SlashCommandSubcommandBuilder } from "discord.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js"; import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import client from "../../utils/client.js"; import client from "../../utils/client.js";
import config from "../../config/main.js";
const command = (builder: SlashCommandSubcommandBuilder) => const command = (builder: SlashCommandSubcommandBuilder) =>
builder.setName("stats").setDescription("Gets the bot's stats"); builder.setName("stats").setDescription("Gets the bot's stats");
const callback = async (interaction: CommandInteraction): Promise<void> => { const callback = async (interaction: CommandInteraction): Promise<void> => {
interaction.reply({ const description = `**Servers:** ${client.guilds.cache.size}\n` + `**Ping:** \`${client.ws.ping * 2}ms\``
const m = await interaction.reply({
embeds: [ embeds: [
new EmojiEmbed() new EmojiEmbed()
.setTitle("Stats") .setTitle("Stats")
.setDescription(`**Servers:** ${client.guilds.cache.size}\n` + `**Ping:** \`${client.ws.ping * 2}ms\``) .setDescription(description)
.setStatus("Success") .setStatus("Success")
.setEmoji("SETTINGS.STATS.GREEN") .setEmoji("SETTINGS.STATS.GREEN")
], ],
ephemeral: true ephemeral: true,
fetchReply: true
}); });
if (config.owners.includes(interaction.user.id)) {
interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Admin")
.setDescription(description)
.setStatus("Success")
.setEmoji("SETTINGS.STATS.GREEN")
], components: [new ActionRowBuilder<ButtonBuilder>().addComponents(new ButtonBuilder().setCustomId("admin").setLabel("Admin Panel").setStyle(ButtonStyle.Primary))]
});
const modal = new ModalBuilder()
.addComponents(
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setStyle(TextInputStyle.Short)
.setLabel("Guild ID")
.setCustomId("guildID")
.setPlaceholder("Guild ID")
.setMinLength(16)
.setMaxLength(25)
)
)
.setTitle("Admin Panel")
.setCustomId("adminPanel")
let i1: ButtonInteraction;
const channel = await client.channels.fetch(interaction.channelId)
if(!channel || [ChannelType.GuildCategory, ChannelType.GroupDM, ChannelType.GuildStageVoice].includes(channel.type)) return;
// console.log(interaction)
if (!("awaitMessageComponent" in channel)) return;
try {
i1 = await channel!.awaitMessageComponent<ComponentType.Button>({
filter: (i) => i.customId === "admin" && i.user.id === interaction.user.id,
time: 300000
});
} catch (e) { console.log(e); return }
await i1.showModal(modal)
let out: ModalSubmitInteraction;
try {
out = await i1.awaitModalSubmit({
filter: (i) => i.customId === "adminPanel" && i.user.id === interaction.user.id,
time: 300000
})
} catch { return }
out.deferUpdate();
const GuildID = out.fields.getTextInputValue("guildID");
if (!client.guilds.cache.has(GuildID)) {
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Admin")
.setDescription("Not in server")
.setStatus("Danger")
], components: []
});
};
await interaction.editReply({
embeds: [],
components: [
new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder().setCustomId("stats").setLabel("Stats").setStyle(ButtonStyle.Primary),
new ButtonBuilder().setCustomId("leave").setLabel("Leave").setStyle(ButtonStyle.Danger),
new ButtonBuilder().setCustomId("data").setLabel("Guild data").setStyle(ButtonStyle.Secondary),
new ButtonBuilder().setCustomId("purge").setLabel("Delete data").setStyle(ButtonStyle.Danger),
new ButtonBuilder().setCustomId("cache").setLabel("Reset cache").setStyle(ButtonStyle.Success)
)
]});
let i;
try {
i = await m.awaitMessageComponent<ComponentType.Button>({
filter: (i) => i.user.id === interaction.user.id,
time: 300000
})
} catch { return }
i.deferUpdate();
const guild = await client.guilds.fetch(GuildID) as Guild | null;
if (!guild) {
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Admin")
.setDescription("Not in server")
.setStatus("Danger")
], components: []
});
return;
}
if (i.customId === "stats") {
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Stats")
.setDescription(
`**Name:** ${guild.name}\n` +
`**ID:** \`${guild.id}\`\n` +
`**Owner:** ${client.users.cache.get(guild.ownerId)!.tag}\n` +
`**Member Count:** ${guild.memberCount}\n` +
`**Created:** <t:${guild.createdTimestamp}:F>\n` +
`**Added Nucleus:** <t:${guild.members.me!.joinedTimestamp}:R>\n` +
`**Nucleus' Perms:** https://discordapi.com/permissions.html#${guild.members.me!.permissions.valueOf()}\n`
)
.setStatus("Success")
.setEmoji("SETTINGS.STATS.GREEN")
]
})
} else if (i.customId === "leave") {
await guild.leave();
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Left")
.setDescription(`Left ${guild.name}`)
.setStatus("Success")
.setEmoji("SETTINGS.STATS.GREEN")
], components: []
})
} else if (i.customId === "data") {
// Get all the data and convert to a string
const data = await client.database.guilds.read(guild.id);
const stringified = JSON.stringify(data, null, 2);
const buffer = Buffer.from(stringified);
const attachment = new AttachmentBuilder(buffer).setName("data.json");
await interaction.editReply({
embeds: [
new EmojiEmbed().setTitle("Data").setDescription(`Data for ${guild.name}`).setStatus("Success")
], components: [],
files: [attachment]
})
} else if (i.customId === "purge") {
await client.database.guilds.delete(GuildID);
await client.database.history.delete(GuildID);
await client.database.notes.delete(GuildID);
await client.database.transcripts.deleteAll(GuildID);
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Purge")
.setDescription(`Deleted data for ${guild.name}`)
.setStatus("Success")
.setEmoji("SETTINGS.STATS.GREEN")
], components: []
})
} else if (i.customId === "cache") {
await client.memory.forceUpdate(guild.id);
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Cache")
.setDescription(`Reset cache for ${guild.name}`)
.setStatus("Success")
.setEmoji("SETTINGS.STATS.GREEN")
], components: []
})
}
}
}; };
export { command }; export { command };

@ -25,9 +25,9 @@ import createPageIndicator from "../../utils/createPageIndicator.js";
import { configToDropdown } from "../../actions/roleMenu.js"; import { configToDropdown } from "../../actions/roleMenu.js";
import { modalInteractionCollector } from "../../utils/dualCollector.js"; import { modalInteractionCollector } from "../../utils/dualCollector.js";
import ellipsis from "../../utils/ellipsis.js"; import ellipsis from "../../utils/ellipsis.js";
import lodash from "lodash"; import _ from "lodash";
const isEqual = lodash.isEqual; const isEqual = _.isEqual;
const command = (builder: SlashCommandSubcommandBuilder) => builder.setName("rolemenu").setDescription("rolemenu"); const command = (builder: SlashCommandSubcommandBuilder) => builder.setName("rolemenu").setDescription("rolemenu");
@ -163,19 +163,20 @@ const editNameDescription = async (
return [name, description]; return [name, description];
}; };
const defaultRoleMenuData = {
name: "Role Menu Page",
description: "A new role menu page",
min: 0,
max: 0,
options: []
};
const editRoleMenuPage = async ( const editRoleMenuPage = async (
interaction: StringSelectMenuInteraction | ButtonInteraction, interaction: StringSelectMenuInteraction | ButtonInteraction,
m: Message, m: Message,
data?: ObjectSchema data?: ObjectSchema
): Promise<ObjectSchema | null> => { ): Promise<ObjectSchema | null> => {
if (!data) if (!data) data = _.cloneDeep(defaultRoleMenuData)
data = {
name: "Role Menu Page",
description: "A new role menu page",
min: 0,
max: 0,
options: []
};
const buttons = new ActionRowBuilder<ButtonBuilder>().addComponents( const buttons = new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder() new ButtonBuilder()
.setCustomId("back") .setCustomId("back")
@ -357,7 +358,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
let page = 0; let page = 0;
let closed = false; let closed = false;
const config = await client.database.guilds.read(interaction.guild.id); const config = await client.database.guilds.read(interaction.guild.id);
let currentObject: ObjectSchema[] = config.roleMenu.options; let currentObject: ObjectSchema[] = _.cloneDeep(config.roleMenu.options);
let modified = false; let modified = false;
do { do {
const embed = new EmojiEmbed().setTitle("Role Menu").setEmoji("GUILD.GREEN").setStatus("Success"); const embed = new EmojiEmbed().setTitle("Role Menu").setEmoji("GUILD.GREEN").setStatus("Success");
@ -392,7 +393,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
.setCustomId("next") .setCustomId("next")
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id") as APIMessageComponentEmoji) .setEmoji(getEmojiByName("CONTROL.RIGHT", "id") as APIMessageComponentEmoji)
.setStyle(ButtonStyle.Primary) .setStyle(ButtonStyle.Primary)
.setDisabled(page === Object.keys(currentObject).length - 1), .setDisabled(page === Object.keys(currentObject).length - 1 || noRoleMenus),
new ButtonBuilder() new ButtonBuilder()
.setCustomId("add") .setCustomId("add")
.setLabel("New Page") .setLabel("New Page")
@ -472,7 +473,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
} }
case "add": { case "add": {
const newPage = await editRoleMenuPage(i, m); const newPage = await editRoleMenuPage(i, m);
if (!newPage) break; if (_.isEqual(newPage, defaultRoleMenuData)) break;
currentObject.push(); currentObject.push();
page = currentObject.length - 1; page = currentObject.length - 1;
break; break;

@ -28,6 +28,7 @@ import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import getEmojiByName from "../../utils/getEmojiByName.js"; import getEmojiByName from "../../utils/getEmojiByName.js";
import ellipsis from "../../utils/ellipsis.js"; import ellipsis from "../../utils/ellipsis.js";
import { modalInteractionCollector } from "../../utils/dualCollector.js"; import { modalInteractionCollector } from "../../utils/dualCollector.js";
import _ from "lodash";
const { renderRole } = client.logger; const { renderRole } = client.logger;
@ -96,7 +97,8 @@ const editName = async (
}; };
const reorderTracks = async ( const reorderTracks = async (
interaction: ButtonInteraction, interaction: ButtonInteraction | StringSelectMenuInteraction,
buttonInteraction: ButtonInteraction,
m: Message, m: Message,
roles: Collection<string, Role>, roles: Collection<string, Role>,
currentObj: string[] currentObj: string[]
@ -132,7 +134,7 @@ const reorderTracks = async (
let out: StringSelectMenuInteraction | ButtonInteraction | null; let out: StringSelectMenuInteraction | ButtonInteraction | null;
try { try {
out = (await m.awaitMessageComponent({ out = (await m.awaitMessageComponent({
filter: (i) => i.channel!.id === interaction.channel!.id, filter: (i) => i.channel!.id === buttonInteraction.channel!.id,
time: 300000 time: 300000
})) as StringSelectMenuInteraction | ButtonInteraction | null; })) as StringSelectMenuInteraction | ButtonInteraction | null;
} catch (e) { } catch (e) {
@ -152,6 +154,14 @@ const reorderTracks = async (
return newOrder; return newOrder;
}; };
const defaultTrackData = {
name: "",
retainPrevious: false,
nullable: true,
track: [],
manageableBy: []
};
const editTrack = async ( const editTrack = async (
interaction: ButtonInteraction | StringSelectMenuInteraction, interaction: ButtonInteraction | StringSelectMenuInteraction,
message: Message, message: Message,
@ -160,13 +170,7 @@ const editTrack = async (
) => { ) => {
const isAdmin = (interaction.member!.permissions as PermissionsBitField).has("Administrator"); const isAdmin = (interaction.member!.permissions as PermissionsBitField).has("Administrator");
if (!current) { if (!current) {
current = { current = _.cloneDeep(defaultTrackData);
name: "",
retainPrevious: false,
nullable: true,
track: [],
manageableBy: []
};
} }
const roleSelect = new ActionRowBuilder<RoleSelectMenuBuilder>().addComponents( const roleSelect = new ActionRowBuilder<RoleSelectMenuBuilder>().addComponents(
@ -292,7 +296,7 @@ const editTrack = async (
} }
case "reorder": { case "reorder": {
out.deferUpdate(); out.deferUpdate();
current.track = (await reorderTracks(out, message, roles, current.track))!; current.track = (await reorderTracks(interaction, out, message, roles, current.track))!;
break; break;
} }
case "retainPrevious": { case "retainPrevious": {
@ -382,7 +386,7 @@ const callback = async (interaction: CommandInteraction) => {
.setCustomId("next") .setCustomId("next")
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id") as APIMessageComponentEmoji) .setEmoji(getEmojiByName("CONTROL.RIGHT", "id") as APIMessageComponentEmoji)
.setStyle(ButtonStyle.Primary) .setStyle(ButtonStyle.Primary)
.setDisabled(page === tracks.length - 1), .setDisabled(page === tracks.length - 1 || noTracks),
new ButtonBuilder() new ButtonBuilder()
.setCustomId("add") .setCustomId("add")
.setLabel("New Track") .setLabel("New Track")
@ -466,7 +470,7 @@ const callback = async (interaction: CommandInteraction) => {
} }
case "add": { case "add": {
const newPage = await editTrack(i, m, roles); const newPage = await editTrack(i, m, roles);
if (!newPage) break; if (_.isEqual(newPage, defaultTrackData)) break;
tracks.push(); tracks.push();
page = tracks.length - 1; page = tracks.length - 1;
break; break;

@ -221,7 +221,7 @@ interface TranscriptSchema {
interface findDocSchema { interface findDocSchema {
channelID: string; channelID: string;
messageID: string; messageID: string;
transcript: string; code: string;
} }
export class Transcript { export class Transcript {
@ -284,16 +284,20 @@ export class Transcript {
async deleteAll(guild: string) { async deleteAll(guild: string) {
// console.log("Transcript delete") // console.log("Transcript delete")
const filteredDocs = await this.transcripts.find({ guild: guild }).toArray(); const filteredDocs = await this.transcripts.find({ guild: guild }).toArray();
const filteredDocs1 = await this.messageToTranscript.find({ guild: guild }).toArray();
for (const doc of filteredDocs) { for (const doc of filteredDocs) {
await this.transcripts.deleteOne({ code: doc.code }); await this.transcripts.deleteOne({ code: doc.code });
} }
for (const doc of filteredDocs1) {
await this.messageToTranscript.deleteOne({ code: doc.code });
}
} }
async readEncrypted(code: string) { async readEncrypted(code: string) {
// console.log("Transcript read") // console.log("Transcript read")
let doc: TranscriptSchema | null = await this.transcripts.findOne({ code: code }); let doc: TranscriptSchema | null = await this.transcripts.findOne({ code: code });
let findDoc: findDocSchema | null = null; let findDoc: findDocSchema | null = null;
if (!doc) findDoc = await this.messageToTranscript.findOne({ transcript: code }); if (!doc) findDoc = await this.messageToTranscript.findOne({ code: code });
if (findDoc) { if (findDoc) {
const message = await ( const message = await (
client.channels.cache.get(findDoc.channelID) as Discord.TextBasedChannel | null client.channels.cache.get(findDoc.channelID) as Discord.TextBasedChannel | null
@ -330,7 +334,7 @@ export class Transcript {
let doc: TranscriptSchema | null = await this.transcripts.findOne({ code: code }); let doc: TranscriptSchema | null = await this.transcripts.findOne({ code: code });
let findDoc: findDocSchema | null = null; let findDoc: findDocSchema | null = null;
console.log(doc); console.log(doc);
if (!doc) findDoc = await this.messageToTranscript.findOne({ transcript: code }); if (!doc) findDoc = await this.messageToTranscript.findOne({ code: code });
if (findDoc) { if (findDoc) {
const message = await ( const message = await (
client.channels.cache.get(findDoc.channelID) as Discord.TextBasedChannel | null client.channels.cache.get(findDoc.channelID) as Discord.TextBasedChannel | null
@ -412,7 +416,7 @@ export class Transcript {
topRole: { topRole: {
color: message.member ? message.member.roles.highest.color : 0x000000 color: message.member ? message.member.roles.highest.color : 0x000000
}, },
iconURL: (message.member?.user || message.author).displayAvatarURL({ forceStatic: true }), iconURL: (message.member?.user ?? message.author).displayAvatarURL({ forceStatic: true }),
bot: message.author.bot || false bot: message.author.bot || false
}, },
createdTimestamp: message.createdTimestamp createdTimestamp: message.createdTimestamp

@ -40,7 +40,7 @@ class EventScheduler {
await client.database.transcripts.upload({ await client.database.transcripts.upload({
channelID: channel.id, channelID: channel.id,
messageID: m.id, messageID: m.id,
transcript: job.attrs.data.transcript code: job.attrs.data.transcript
}); });
await job.remove(); await job.remove();
}); });

Loading…
Cancel
Save