NoMoreAcronyms/commands/drawDesign.cjs

284 lines
7.4 KiB
JavaScript

const { SlashCommandBuilder, Discord, codeBlock, EmbedBuilder } = require('discord.js');
const fs = require('fs');
var path = require('node:path');
2023-04-05 00:49:38 +07:00
//const { writeFile } = require('../main.cjs');
2023-04-04 20:50:02 +07:00
module.exports = {
data: new SlashCommandBuilder()
.setName('drawdesign')
.setDescription('Draws a design in a codeblock')
.addStringOption(option =>
option.setName('design')
2023-04-08 23:13:51 +07:00
.setDescription("Pick a design. (number 1-5)")
2023-04-04 20:50:02 +07:00
.setRequired(true)
)
.addStringOption(option =>
option.setName('string')
.setDescription("String to feed into input")
.setRequired(true)
),
async execute(interaction, client) {
2023-04-05 00:49:38 +07:00
let inputString = interaction.options.getString('string');
let design = parseInt(interaction.options.getString('design'));
2023-04-08 23:15:03 +07:00
if (design < 1 || design > 5) {
2023-04-04 20:50:02 +07:00
await interaction.reply('Invalid design choice.');
2023-04-04 21:23:21 +07:00
return;
2023-04-04 20:50:02 +07:00
}
2023-04-05 00:49:38 +07:00
let output;
2023-04-04 20:50:02 +07:00
switch (design) {
case 1:
2023-04-04 21:08:24 +07:00
output = design1(inputString);
2023-04-04 20:50:02 +07:00
break;
case 2:
2023-04-04 21:08:24 +07:00
output = design2(inputString);
2023-04-04 20:50:02 +07:00
break;
case 3:
2023-04-04 21:08:24 +07:00
output = design3(inputString);
2023-04-04 20:50:02 +07:00
break;
2023-04-04 23:40:36 +07:00
case 4:
output = design4(inputString);
2023-04-08 23:13:51 +07:00
break;
case 5:
output = design5(inputString);
break;
2023-04-04 20:50:02 +07:00
}
2023-04-08 22:32:44 +07:00
//console.log(codeBlock("", output));
2023-04-05 00:49:38 +07:00
let testLength = "\n" + 'output length was ' + (output.length) + " characters.";
2023-04-04 21:26:00 +07:00
if (output.length + testLength.length > 2000) {
//await interaction.reply('Error: String is too big. Resultant output would be too big to send to Discord. (the output length was ' + (output.length + testLength.length) + " characters.)");
let replyString = "output length was " + (output.length) + " characters.";
let filePath = writeFile(output);
2023-04-09 09:20:06 +07:00
await interaction.reply({ content: replyString, files: [filePath] });
fs.unlinkSync(filePath); // Delete file once we're done with it
} else {
await interaction.reply(codeBlock("", output) + testLength);
2023-04-04 21:18:51 +07:00
}
2023-04-04 20:50:02 +07:00
console.log("User " + interaction.user.tag + " ran /drawtriangle");
},
};
2023-04-05 00:49:38 +07:00
function writeFile(content) {
//console.log(content);
console.log("Attempting to write string to file...");
2023-04-09 09:20:06 +07:00
let filename = Date.now() + '.txt';
console.log(filename);
var filePath = path.join(__dirname, '..', filename);
console.log(filePath);
fs.writeFile(filePath, content, err => {
if (err) {
console.error(err);
}
});
2023-04-09 09:20:06 +07:00
return filePath;
2023-04-05 00:49:38 +07:00
}
2023-04-04 20:50:02 +07:00
function design1(input) {
2023-04-04 21:10:00 +07:00
console.log("Running design1...");
2023-04-05 00:49:38 +07:00
let outputString;
let startEnd = "";
2023-04-04 20:50:02 +07:00
for (let i = 0; i < input.length + 2; i++) {
startEnd += "*";
}
outputString = startEnd + "\n";
outputString += "*" + "\n";
outputString += "* " + input + "\n";
outputString += "*" + "\n";
outputString += startEnd;
return outputString;
}
function design2(input) {
2023-04-04 21:10:00 +07:00
console.log("Running design2...");
2023-04-05 00:49:38 +07:00
let outputString;
let height = (input.length * 2) + 6;
let mid = Math.trunc(height / 2) + 1;
2023-04-04 20:50:02 +07:00
if (height % 2 == 0) {
height++;
}
outputString = "";
for (let i = 0; i < height; i++) {
if (mid == i) { //Determine if we're in the middle of the triangle
outputString += "**" + input + "**";
} else {
for (let j = 0; j < i; j++) {
outputString += "*";
}
}
outputString += "\n";
}
return outputString;
}
function design3(input) {
2023-04-04 21:10:00 +07:00
console.log("Running design3...");
2023-04-05 00:49:38 +07:00
let outputString;
let height = (input.length * 2) + 6;
let mid = Math.trunc(height / 2) + 1;
2023-04-04 20:50:02 +07:00
if (height % 2 == 0) {
height++;
}
outputString = "";
if (mid % 2 == 1) { // Skip a line if odd
var subOffset = 1;
var addOffset = 0;
} else {
var subOffset = 0;
var addOffset = 1;
}
for (let i = 0; i < mid - addOffset; i++) {
for (let j = 0; j < i; j++) {
if (i % 2 == 1) {
if (i != (mid - 1)) {
if (i == 0 || (j == 0 || j == (i - 1))) { // Check if we're at the beginning or end of the line
outputString += "*";
} else {
2023-04-04 21:13:42 +07:00
outputString += " ";
2023-04-04 20:50:02 +07:00
}
}
}
}
outputString += "\n";
}
outputString += "* " + input + " *\n";
for (let i = mid - subOffset; i > 0; i--) {
for (let j = 0; j < i; j++) {
if (i % 2 == 1) {
if (j != (mid - 1) || (j != mid)) {
if ((i == 0 || (j == 0 || j == (i - 1)))) { // Check if we're at the beginning or end of the line
outputString += "*";
} else {
2023-04-04 21:13:42 +07:00
outputString += " ";
2023-04-04 20:50:02 +07:00
}
}
}
}
outputString += "\n";
}
return outputString;
2023-04-04 23:40:36 +07:00
}
function design4(input) {
2023-04-05 00:49:38 +07:00
let outputString = "";
2023-04-08 22:25:20 +07:00
let outputLine = "";
let radius = (input.length + 1);
2023-04-05 00:49:38 +07:00
let mid = radius;
2023-04-04 23:40:36 +07:00
if (mid % 2 == 1) {
var spaceOffset = " ";
} else {
var spaceOffset = "";
}
2023-04-08 22:25:20 +07:00
console.log(radius, mid);
2023-04-04 23:40:36 +07:00
// dist represents distance to the center
2023-04-05 00:49:38 +07:00
let dist = parseFloat(0);
let space = ""
2023-04-04 23:40:36 +07:00
for (let i = 0; i < (input.length / 2); ++i) {
space += " ";
}
// for horizontal movement
2023-04-08 22:25:20 +07:00
var i;
var j;
let lineHasInput = false;
for (i = 0; i <= 2 * radius; i++) {
lineHasInput = false;
if (Math.trunc(i) != mid) {
2023-04-09 09:20:06 +07:00
// for vertical movement
for (j = 0; j <= 2 * radius; j++) {
dist = Math.sqrt(
((i - radius) * (i - radius) * 4) + // (* 4) accounts for the offset between lines
(j - radius) * (j - radius)
);
//console.log(i, j, radius, dist);
// dist should be in the range (radius - 0.5)
// and (radius + 0.5) to print stars(*)
if (dist > radius - 1 && dist < radius + 1) { //&& dist > radius - 1
lineHasInput = true;
outputLine += "​·"; //zero-width space
} else {
outputLine += " ";
2023-04-04 23:40:36 +07:00
}
2023-04-09 09:20:06 +07:00
}
2023-04-04 23:40:36 +07:00
} else {
2023-04-08 22:25:20 +07:00
lineHasInput = true;
2023-04-09 09:02:13 +07:00
outputLine += "​·" + space + input + space + spaceOffset + "·"; //zero-width space
2023-04-04 23:40:36 +07:00
}
2023-04-08 22:25:20 +07:00
//console.log(i, j, outputLine);
if (lineHasInput) {
outputString += outputLine + "\n";
}
outputLine = "";
2023-04-04 23:40:36 +07:00
}
return outputString;
2023-04-08 22:25:20 +07:00
}
2023-04-08 23:12:49 +07:00
var charIterateState;
function charIterate(input) {
2023-04-08 23:16:33 +07:00
if (charIterateState == undefined) {
charIterateState = 0;
2023-04-08 23:12:49 +07:00
} else {
2023-04-09 09:20:06 +07:00
if (charIterateState < (input.length - 1)) {
charIterateState++;
} else {
charIterateState = 0;
}
2023-04-08 23:12:49 +07:00
}
2023-04-09 09:16:00 +07:00
console.log(charIterateState, input.charAt(charIterateState));
2023-04-08 23:12:49 +07:00
return charIterateState;
}
function design5(input) {
let outputString = "";
let outputLine = "";
let radius = (input.length);
let mid = radius;
if (mid % 2 == 1) {
var spaceOffset = " ";
} else {
var spaceOffset = "";
}
console.log(radius, mid);
// dist represents distance to the center
let dist = parseFloat(0);
let space = ""
for (let i = 0; i < (input.length / 2); ++i) {
space += " ";
}
// for horizontal movement
var i;
var j;
let lineHasInput = false;
for (i = 0; i <= 2 * radius; i++) {
lineHasInput = false;
if (Math.trunc(i) != mid) {
2023-04-09 09:20:06 +07:00
// for vertical movement
for (j = 0; j <= 2 * radius; j++) {
dist = Math.sqrt(
((i - radius) * (i - radius) * 4) + // (* 4) accounts for the offset between lines
(j - radius) * (j - radius)
);
//console.log(i, j, radius, dist);
// dist should be in the range (radius - 0.5)
// and (radius + 0.5) to print stars(*)
if (dist > radius - 1 && dist < radius + 1) { //&& dist > radius - 1
lineHasInput = true;
outputLine += "" + input.charAt(charIterate(input)); //zero-width space
} else {
outputLine += " ";
2023-04-08 23:12:49 +07:00
}
2023-04-09 09:20:06 +07:00
}
2023-04-08 23:12:49 +07:00
} else {
lineHasInput = true;
2023-04-08 23:18:52 +07:00
outputLine += input.charAt(charIterate(input)) + space + input + space + spaceOffset + input.charAt(charIterate(input));
2023-04-08 23:12:49 +07:00
}
//console.log(i, j, outputLine);
if (lineHasInput) {
outputString += outputLine + "\n";
}
outputLine = "";
}
return outputString;
}
2023-04-08 22:25:39 +07:00
//console.log(design4("super long test string super long test string"));
2023-04-08 22:25:20 +07:00
//"super long test string super long test string"