editing messageEdit logs to be clearer.

Co-authored-by: PineappleFan <pineapplefanyt@gmail.com>
Co-authored-by: Skyler <skyler3665@gmail.com>
pull/101/head
TheCodedProf 3 years ago
parent 9d9ce0e362
commit 4a7c25dd92
No known key found for this signature in database
GPG Key ID: 803E7CCB5577E6A2

@ -1,4 +1 @@
if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
fi
use flake

@ -1,5 +1,65 @@
{
"nodes": {
"clicks-server": {
"inputs": {
"deploy-rs": "deploy-rs",
"flake-utils": "flake-utils",
"home-manager": "home-manager",
"nixpkgs": "nixpkgs_2",
"nixpkgs-unstable": "nixpkgs-unstable",
"scalpel": "scalpel",
"sops-nix": "sops-nix"
},
"locked": {
"lastModified": 1684677493,
"narHash": "sha256-M5Q3ZefLi1aLNU1FGuWisDooi0JIaHhOiRfK/XUbhlc=",
"owner": "clicksminuteper",
"repo": "nixfiles",
"rev": "8f59742cd1e17d16e6b0d1cf9dc02ef6e74471ee",
"type": "github"
},
"original": {
"owner": "clicksminuteper",
"repo": "nixfiles",
"type": "github"
}
},
"deploy-rs": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs": "nixpkgs",
"utils": "utils"
},
"locked": {
"lastModified": 1682063650,
"narHash": "sha256-VaDHh2z6xlnTHaONlNVHP7qEMcK5rZ8Js3sT6mKb2XY=",
"owner": "serokell",
"repo": "deploy-rs",
"rev": "c2ea4e642dc50fd44b537e9860ec95867af30d39",
"type": "github"
},
"original": {
"owner": "serokell",
"repo": "deploy-rs",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1668681692,
"narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "009399224d5e398d03b22badca40a37ac85412a1",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
@ -18,26 +78,210 @@
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1681202837,
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_3": {
"inputs": {
"systems": "systems_3"
},
"locked": {
"lastModified": 1685518550,
"narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
"clicks-server",
"nixpkgs"
],
"utils": [
"clicks-server",
"deploy-rs",
"utils"
]
},
"locked": {
"lastModified": 1681092193,
"narHash": "sha256-JerCqqOqbT2tBnXQW4EqwFl0hHnuZp21rIQ6lu/N4rI=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "f9edbedaf015013eb35f8caacbe0c9666bbc16af",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-22.11",
"repo": "home-manager",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1682134069,
"narHash": "sha256-TnI/ZXSmRxQDt2sjRYK/8j8iha4B4zP2cnQCZZ3vp7k=",
"lastModified": 1671417167,
"narHash": "sha256-JkHam6WQOwZN1t2C2sbp1TqMv3TVRjzrdoejqfefwrM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "bb31220cca6d044baa6dc2715b07497a2a7c4bc7",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1683504292,
"narHash": "sha256-jlZbBIKGa6IMGkcJkQ08pbKnouTAPfeq1fD5I7l/rBw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fd901ef4bf93499374c5af385b2943f5801c0833",
"rev": "ba0086c178d4ed60a7899f739caea553eca2e046",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "release-22.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1683777345,
"narHash": "sha256-V2p/A4RpEGqEZussOnHYMU6XglxBJGCODdzoyvcwig8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "635a306fc8ede2e34cb3dd0d6d0a5d49362150ed",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1682817260,
"narHash": "sha256-kFMXzKNj4d/0Iqbm5l57rHSLyUeyCLMuvlROZIuuhvk=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "db1e4eeb0f9a9028bcb920e00abbc1409dd3ef36",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-22.11",
"repo": "nixpkgs",
"type": "github"
}
},
"pnpm2nix": {
"inputs": {
"flake-utils": "flake-utils_3",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1686170768,
"narHash": "sha256-obaJ1E5vzrgFsj7aYIR7AHGrKbYFkhoxgzJabAsOycc=",
"owner": "clicksminuteper",
"repo": "pnpm2nix",
"rev": "4626cc787d4d8d9b0e74c4039aa0a05100381b44",
"type": "github"
},
"original": {
"owner": "clicksminuteper",
"repo": "pnpm2nix",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
"clicks-server": "clicks-server",
"flake-utils": "flake-utils_2",
"nixpkgs": [
"clicks-server",
"nixpkgs"
],
"pnpm2nix": "pnpm2nix"
}
},
"scalpel": {
"inputs": {
"nixpkgs": [
"clicks-server",
"nixpkgs"
],
"sops-nix": [
"clicks-server",
"sops-nix"
]
},
"locked": {
"lastModified": 1655566736,
"narHash": "sha256-Vyolf8j7QcAHyVTQMqS8EGYZ/P6leJtiVNhYyIxoMRw=",
"owner": "polygon",
"repo": "scalpel",
"rev": "16c2103d613bb1c7adc6dbf2a17c2980ce08567f",
"type": "github"
},
"original": {
"owner": "polygon",
"repo": "scalpel",
"type": "github"
}
},
"sops-nix": {
"inputs": {
"nixpkgs": [
"clicks-server",
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1683545104,
"narHash": "sha256-48wC0zzHAej/wLFWIgV+uj63AvQ2UUk85g7wmXJzTqk=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "36b062a2c85a0efb37de1300c79c54602a094fab",
"type": "github"
},
"original": {
"owner": "Mic92",
"repo": "sops-nix",
"type": "github"
}
},
"systems": {
@ -54,8 +298,53 @@
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"utils": {
"locked": {
"lastModified": 1667395993,
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
}

@ -1,17 +1,63 @@
{
description = "A basic flake with a shell";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11";
inputs.nixpkgs.follows = "clicks-server/nixpkgs";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.clicks-server.url = "github:clicksminuteper/nixfiles";
inputs.pnpm2nix.url = "github:clicksminuteper/pnpm2nix";
outputs = { self, nixpkgs, flake-utils }:
inputs.pnpm2nix.inputs.nixpkgs.follows = "nixpkgs";
outputs = { self, nixpkgs, flake-utils, clicks-server, pnpm2nix }:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages.${system};
in {
nodejs = pkgs.nodejs-19_x;
nodePackages = pkgs.nodePackages_latest;
lib = pkgs.lib;
in rec {
devShells.default = pkgs.mkShell {
packages = [ pkgs.nodejs-19_x pkgs.nodePackages_latest.yarn ];
packages = [ nodejs nodePackages.pnpm ];
shellHook = ''
unset name
'';
};
packages.env = lib.pipe {
src = ./.;
packageJSON = ./package.json;
} [
pnpm2nix.mkPnpmPackage
pnpm2nix.mkPnpmEnv
];
packages.default = let
packageJSON = (builtins.fromJSON (builtins.readFile ./package.json));
in pkgs.stdenv.mkDerivation {
pname = "nucleus";
version = packageJSON.version;
src = ./.;
buildInputs = [ packages.env nodejs nodePackages.pnpm ];
nativeBuildInputs = [ packages.env nodePackages.pnpm ];
buildPhase = ''
pnpm run build
'';
installPhase = ''
cp dist $out
mkdir -p $out/bin
echo "#!/usr/bin/env bash\ncd $out\n${packageJSON.scripts.start}" > $out/bin/nucleus
'';
};
dockerImage = let
nucleus = packages.default;
in pkgs.dockerTools.streamLayeredImage {
name = "nucleus";
tag = "latest";
contents = [ nucleus ];
config.Cmd = [ "${nucleus}/bin/nucleus" ];
};
});
}

@ -37,20 +37,20 @@
"description": "Nucleus: The core of your server",
"main": "dist/index.js",
"scripts": {
"build": "tsc && yarn copy-files",
"build": "tsc && pnpm copy-files",
"copy-files": "copyfiles -u 1 src/reflex/nsfwjs/example/nsfw_demo/public/model/**/* dist/",
"start": "node --experimental-json-modules --enable-source-maps dist/index.js",
"dev": "rm -rf dist && eslint src --fix && yarn build && node --experimental-json-modules --enable-source-maps dist/index.js",
"force-dev": "clear; rm -rf dist; tsc-suppress && yarn copy-files && node --experimental-json-modules --enable-source-maps dist/index.js",
"lint": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To auto-fix everything possible, please run `yarn lint-fix`'; true",
"lint-no-stylecheck": "echo 'Linting...'; eslint src; echo 'A full lint and style check is required for PRs to be accepted. Please run `yarn lint` before committing'; true",
"dev": "rm -rf dist && eslint src --fix && pnpm build && node --experimental-json-modules --enable-source-maps dist/index.js",
"force-dev": "clear; rm -rf dist; tsc-suppress && pnpm copy-files && node --experimental-json-modules --enable-source-maps dist/index.js",
"lint": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To auto-fix everything possible, please run `pnpm lint-fix`'; true",
"lint-no-stylecheck": "echo 'Linting...'; eslint src; echo 'A full lint and style check is required for PRs to be accepted. Please run `pnpm lint` before committing'; true",
"lint-fix": "echo 'Fixing eslint issues...'; eslint src --fix; echo 'Reformatting...'; prettier --write --loglevel warn --cache .; true",
"lint-list": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To view errors in more detail, please run `yarn lint`'; true",
"lint-list": "echo 'Style checking...'; prettier --check .; echo 'Linting...'; eslint src; echo 'To view errors in more detail, please run `pnpm lint`'; true",
"lint-ci": "echo 'Style checking...' && prettier --check . && echo 'Linting...' && eslint src",
"setup": "node Installer.js",
"win-force-build": "clear | rm -r dist | tsc-suppress | yarn copy-files",
"audit-fix": "yarn-audit-fix",
"versions": "yarn versions && yarn list && node --version",
"setup": "npm i -g pnpm | pnpm | pnpm build | node Installer.js",
"win-force-build": "clear | rm -r dist | tsc-suppress | pnpm copy-files",
"audit-fix": "pnpm audit --fix",
"versions": "pnpm versions && pnpm list && node --version",
"win-lint-fix": "echo 'Fixing eslint issues...' | eslint src --fix | echo 'Reformatting...' | prettier --write --loglevel warn --cache . | true"
},
"repository": {
@ -60,10 +60,10 @@
"author": "Clicks",
"contributors": [
"Minion3665",
"PineappleFan",
"PineaFan",
"TheCodedProf"
],
"license": "SEE LICENSE IN LICENSE",
"license": "AGPL-3.0",
"bugs": {
"url": "https://github.com/ClicksMinutePer/Nucleus/issues"
},

File diff suppressed because it is too large Load Diff

@ -0,0 +1,5 @@
import { type ButtonInteraction } from "discord.js";
export async function callback(interaction: ButtonInteraction) {
console.log(interaction);
}

@ -24,6 +24,7 @@ import { callback as kickCallback, check as kickCheck } from "../commands/mod/ki
import { callback as muteCallback, check as muteCheck } from "../commands/mod/mute.js";
import { callback as nicknameCallback, check as nicknameCheck } from "../commands/mod/nick.js";
import { callback as warnCallback, check as warnCheck } from "../commands/mod/warn.js";
import { callback as logDetailsCallback } from "../actions/logs/showDetails.js";
import client from "../utils/client.js";
export const event = "interactionCreate";
@ -61,6 +62,9 @@ async function interactionCreate(interaction: Interaction) {
case "createtranscript": {
return await createTranscript(interaction);
}
case "log:showDetails": {
return await logDetailsCallback(interaction);
}
}
// Mod actions
if (interaction.customId.startsWith("mod:")) {

@ -1,5 +1,5 @@
import type { NucleusClient } from "../utils/client.js";
import type { Message, MessageReference } from "discord.js";
import { AttachmentBuilder, Message, MessageReference } from "discord.js";
import type Discord from "discord.js";
import * as diff from "diff";
@ -63,68 +63,88 @@ export async function callback(client: NucleusClient, oldMessage: Message, newMe
return;
}
const differences = diff.diffChars(oldContent, newContent);
console.log(differences);
let contentEdit = "";
if (differences.map((d) => (d.added || d.removed ? 1 : 0)).filter((f) => f === 1).length > 0) {
const green = "\x1B[36m";
const red = "\x1B[41m";
const skipped = "\x1B[40;33m";
const reset = "\x1B[0m";
const bold = "\x1B[1m";
const cutoff = 20;
differences.forEach((part) => {
if (!part.added && !part.removed && part.value.length > cutoff) {
contentEdit +=
reset +
part.value.slice(0, cutoff / 2) +
skipped +
`(${part.value.length - cutoff} more)` +
reset +
part.value.slice(-(cutoff / 2));
} else {
if (part.added || part.removed) {
part.value = part.value.replaceAll(" ", "▁");
}
contentEdit += (part.added ? green : part.removed ? red : "") + part.value + reset;
}
});
contentEdit = contentEdit.slice(0, 2000);
contentEdit += `\n\n${bold}Key:${reset} ${green}Added${reset} | ${red}Removed${reset} | ${skipped}Skipped${reset}`;
const data = {
meta: {
type: "messageUpdate",
displayName: "Message Edited",
calculateType: "messageUpdate",
color: NucleusColors.yellow,
emoji: "MESSAGE.EDIT",
timestamp: newMessage.editedTimestamp
},
separate: {
start: `\`\`\`ansi\n${contentEdit}\`\`\``,
end: `[[Jump to message]](${newMessage.url})`
},
list: {
messageId: entry(newMessage.id, `\`${newMessage.id}\``),
sentBy: entry(newMessage.author.id, renderUser(newMessage.author)),
sentIn: entry(newMessage.channel.id, renderChannel(newMessage.channel as Discord.GuildBasedChannel)),
sent: entry(newMessage.createdTimestamp, renderDelta(newMessage.createdTimestamp)),
edited: entry(newMessage.editedTimestamp, renderDelta(newMessage.editedTimestamp)),
mentions: renderNumberDelta(oldMessage.mentions.users.size, newMessage.mentions.users.size),
attachments: entry(
renderNumberDelta(oldMessage.attachments.size, newMessage.attachments.size),
renderNumberDelta(oldMessage.attachments.size, newMessage.attachments.size) + attachmentJump
),
repliedTo: entry(
replyTo ? replyTo.messageId! : null,
replyTo
? `[[Jump to message]](https://discord.com/channels/${newMessage.guild.id}/${newMessage.channel.id}/${replyTo.messageId})`
: "None"
)
},
hidden: {
guild: newMessage.guild.id
}
};
await log(data);
}
const green = "\x1B[36m";
const red = "\x1B[41m";
const skipped = "\x1B[40;33m";
const reset = "\x1B[0m";
const bold = "\x1B[1m";
// console.log(differences);
// let contentAdd = "";
// let contentRemove = "";
// if (differences.map((d) => (d.added || d.removed ? 1 : 0)).filter((f) => f === 1).length > 0) {
// const cutoff = 20;
// differences.forEach((part) => {
// if (!part.added && !part.removed && part.value.length > cutoff) {
// contentAdd +=
// reset +
// part.value.slice(0, cutoff / 2) +
// skipped +
// `(${part.value.length - cutoff} more)` +
// reset +
// part.value.slice(-(cutoff / 2));
// contentRemove +=
// reset +
// part.value.slice(0, cutoff / 2) +
// skipped +
// `(${part.value.length - cutoff} more)` +
// reset +
// part.value.slice(-(cutoff / 2));
// } else {
// if (part.added || part.removed) {
// part.value = part.value.replaceAll(" ", "▁");
// }
// if (part.added) {
// contentAdd += green + part.value + reset;
// } else if (part.removed) {
// contentRemove += red + part.value + reset;
// } else {
// contentAdd += part.value;
// contentRemove += part.value;
// }
// }
// });
const key = `\n\n${bold}Key:${reset} ${green}Added${reset} | ${red}Removed${reset} | ${skipped}Skipped${reset}`;
const data = {
meta: {
type: "messageUpdate",
displayName: "Message Edited",
calculateType: "messageUpdate",
color: NucleusColors.yellow,
emoji: "MESSAGE.EDIT",
timestamp: newMessage.editedTimestamp,
files: [
new AttachmentBuilder(Buffer.from(JSON.stringify(differences)), {
name: "diff.json",
description: "A JSON file containing the differences between the two messages."
})
],
showDetails: true
},
separate: {
start: `To read the full log press the button below.\n\`\`\`ansi\n${key}\`\`\``,
end: `[[Jump to message]](${newMessage.url})`
},
list: {
messageId: entry(newMessage.id, `\`${newMessage.id}\``),
sentBy: entry(newMessage.author.id, renderUser(newMessage.author)),
sentIn: entry(newMessage.channel.id, renderChannel(newMessage.channel as Discord.GuildBasedChannel)),
sent: entry(newMessage.createdTimestamp, renderDelta(newMessage.createdTimestamp)),
edited: entry(newMessage.editedTimestamp, renderDelta(newMessage.editedTimestamp)),
mentions: renderNumberDelta(oldMessage.mentions.users.size, newMessage.mentions.users.size),
attachments: entry(
renderNumberDelta(oldMessage.attachments.size, newMessage.attachments.size),
renderNumberDelta(oldMessage.attachments.size, newMessage.attachments.size) + attachmentJump
),
repliedTo: entry(
replyTo ? replyTo.messageId! : null,
replyTo
? `[[Jump to message]](https://discord.com/channels/${newMessage.guild.id}/${newMessage.channel.id}/${replyTo.messageId})`
: "None"
)
},
hidden: {
guild: newMessage.guild.id
}
};
await log(data);
}

@ -1,10 +1,11 @@
import * as Discord from "discord.js";
import getEmojiByName from "./getEmojiByName.js";
import { toHexArray } from "./calculate.js";
import { promisify } from "util";
import generateKeyValueList from "./generateKeyValueList.js";
import client from "./client.js";
import { DiscordAPIError } from "discord.js";
import { Stream } from "node:stream";
import EmojiEmbed from "./generateEmojiEmbed.js";
const wait = promisify(setTimeout);
@ -16,9 +17,17 @@ export interface LoggerOptions {
color: number;
emoji: string;
timestamp: number;
files?: (
| Discord.BufferResolvable
| Stream
| Discord.JSONEncodable<Discord.APIAttachment>
| Discord.Attachment
| Discord.AttachmentBuilder
| Discord.AttachmentPayload
)[];
showDetails?: boolean;
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
list: any;
list: Record<string, unknown>;
hidden: {
guild: string;
};
@ -116,16 +125,31 @@ export const Logger = {
});
if (channel) {
log.separate = log.separate ?? {};
const embed = new Discord.EmbedBuilder()
.setTitle(`${getEmojiByName(log.meta.emoji)} ${log.meta.displayName}`)
.setDescription(
(log.separate.start ? log.separate.start + "\n" : "") +
generateKeyValueList(description) +
(log.separate.end ? "\n" + log.separate.end : "")
)
.setTimestamp(log.meta.timestamp)
.setColor(log.meta.color);
await channel.send({ embeds: [embed] });
const messageOptions: Parameters<Discord.TextChannel["send"]>[0] = {};
const components: Discord.ActionRowBuilder<Discord.ButtonBuilder> = new Discord.ActionRowBuilder();
messageOptions.embeds = [
new EmojiEmbed()
.setEmoji(log.meta.emoji)
.setTitle(log.meta.displayName)
.setDescription(
(log.separate.start ? log.separate.start + "\n" : "") +
generateKeyValueList(description) +
(log.separate.end ? "\n" + log.separate.end : "")
)
.setTimestamp(log.meta.timestamp)
.setColor(log.meta.color)
];
if (log.meta.files) messageOptions.files = log.meta.files;
if (log.meta.showDetails) {
components.addComponents(
new Discord.ButtonBuilder()
.setCustomId("log:showDetails")
.setLabel("Show Details")
.setStyle(Discord.ButtonStyle.Primary)
);
messageOptions.components = [components];
}
await channel.send(messageOptions);
}
}
},

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save