491 lines
18 KiB
JavaScript
491 lines
18 KiB
JavaScript
const { Embed } = require("discord.js");
|
||
const fs = require("fs");
|
||
const dateFormat = require("dateformat");
|
||
require('dotenv').config()
|
||
const cmd = require('cmd-promise')
|
||
var portastic = require('portastic');
|
||
const { stderr } = require("process");
|
||
let jsonfile = require('jsonfile')
|
||
let rand = Math.floor(Math.random() * 99999999999999);
|
||
let code
|
||
let ifApt
|
||
const date = require('date-and-time');
|
||
const now = new Date();
|
||
const { EmbedBuilder } = require('discord.js');
|
||
const Dockerode = require('simple-dockerode');
|
||
var docker = new Dockerode({ socketPath: '/var/run/docker.sock' });
|
||
let finished
|
||
let end = "<=================================END===========================>"
|
||
|
||
module.exports = {
|
||
name: "x",
|
||
description: "Execute a command non-interactively.",
|
||
options: [{
|
||
"name": "cmd",
|
||
"description": "Command to Execute",
|
||
"required": true,
|
||
"type": 3 // 6 is type USER
|
||
}],
|
||
|
||
run: async (client, interaction) => {
|
||
console.log("RUN")
|
||
await cmd('bash /home/opc/check_exist.sh ' + interaction.user.id).then(out => {
|
||
console.log('out =', out)
|
||
if (out.stdout != 1) {
|
||
(async () => {
|
||
finished = 1
|
||
console.log(end)
|
||
|
||
return await interaction.editReply("Sorry, you do not have a container currently, generate one using /generate")
|
||
})();
|
||
|
||
}
|
||
|
||
}).catch(err => {
|
||
console.log('err =', err)
|
||
})
|
||
console.log("Begin Done")
|
||
|
||
if (finished == 1) {
|
||
finished = 0
|
||
return
|
||
} else {
|
||
|
||
// await interaction.deferReply();
|
||
const path = 'cache/' + interaction.user.id
|
||
const isNotDefined = require("is-not-defined");
|
||
if (isNotDefined(interaction.options._hoistedOptions)) {
|
||
(async () => {
|
||
await interaction.editReply("You must supply a command.")
|
||
|
||
})();
|
||
return
|
||
}
|
||
let code = interaction.options._hoistedOptions[0].value
|
||
if (code.startsWith("apt install") || code.startsWith("yum install")) {
|
||
if (!code.includes("-y")) {
|
||
code = code + " -y"
|
||
console.log(code)
|
||
}
|
||
}
|
||
|
||
if (code.startsWith("pacman install")) {
|
||
if (!code.includes("--noconfirm")) {
|
||
code = code + " --noconfirm"
|
||
console.log(code)
|
||
}
|
||
}
|
||
|
||
|
||
if (code.startsWith("neofetch")) {
|
||
code = "neofetch --stdout"
|
||
}
|
||
|
||
if (fs.existsSync(path)) {
|
||
console.log("")
|
||
}
|
||
else {
|
||
console.log("No Channel PWD Found! Generating!")
|
||
fs.writeFile('./cache/' + interaction.user.id, "{\"pwd\":\"/\"}", function (err) {
|
||
});
|
||
}
|
||
commandToRun = code
|
||
if (commandToRun == "yes") return console.log("yes Blocked")
|
||
|
||
/**
|
||
*
|
||
* Start of Print Working Directory
|
||
*
|
||
*/
|
||
if (commandToRun == "pwd") {
|
||
goNoFurther = true
|
||
// check for channel pwd support file
|
||
if (fs.existsSync(path)) {
|
||
console.log("Channel PWD is active")
|
||
jsonfile = require('jsonfile')
|
||
jsonfile.readFile(path, function (err, pwdata) {
|
||
// console.log(pwdata)
|
||
(async () => {
|
||
await interaction.editReply("```" + pwdata.pwd + "```")
|
||
})();
|
||
goNoFurther = false;
|
||
if (err) console.error(err)
|
||
})
|
||
}
|
||
function escapeDoubleQuotes(str) {
|
||
return str.replace(/\\([\s\S])|(")/g, "\\$1$2"); // thanks @slevithan!
|
||
}
|
||
}
|
||
/**
|
||
*
|
||
* Main
|
||
*
|
||
*/
|
||
if (commandToRun == "pwd") return
|
||
// /**
|
||
// *
|
||
// * Start of Write
|
||
// *
|
||
// */
|
||
// console.log("cmd: " + commandToRun)
|
||
// if (commandToRun.startsWith("write")) {
|
||
// const echoFile = require('write');
|
||
// const cmd = require('cmd-promise')
|
||
// re = /\{([\s\S)]+)\}/;
|
||
// re2 = /\^(.*)\^/;
|
||
// if (commandToRun.toString().includes("\n")) console.log("YES! BREAK")
|
||
// let cdcmdtest = commandToRun // First index is removed and array is returned.
|
||
// jsonfile.readFile(path, function (err, pwdata) {
|
||
// if (err) console.error(err)
|
||
// // Regular Expression To find Sections fo command
|
||
// let codeToSend = cdcmdtest.match(re)[1]; // yes, start at 0, not 1. I hate that too.
|
||
// console.log("codeToSend: " + codeToSend)
|
||
// let fileToSend = cdcmdtest.match(re2)[1]; // yes, start at 0, not 1. I hate that too.
|
||
// console.log("file: " + fileToSend)
|
||
// // let usrcmd = cdcmdtest.slice(0).join(" ");
|
||
// jsonfile.readFile(path, function (err, pwdata) {
|
||
// if (err) console.error(err)
|
||
// //await interaction.editReply(pwdata.pwd);
|
||
// const cmd = require('cmd-promise')
|
||
// // let usrcmd = cdcmdtest.slice(0).join(" ");
|
||
// console.log("/tmp/tmpfile/" + rand + "/" + fileToSend)
|
||
// echoFile.sync("/tmp/tmpfile/" + rand + "/" + fileToSend, codeToSend, {
|
||
// newline: true
|
||
// });
|
||
// console.log('docker cp ' + "/tmp/tmpfile/" + rand + "/" + fileToSend + ' ' + interaction.user.id + ':' + pwdata.pwd)
|
||
// cmd('docker cp ' + "/tmp/tmpfile/" + + rand + "/" + fileToSend + ' ' + interaction.user.id + ':' + pwdata.pwd).then(out => {
|
||
// console.log('out =', out)
|
||
// try {
|
||
// fs.unlinkSync("/tmp/tmpfile/" + + rand + "/" + fileToSend)
|
||
// console.log("tmpfileremoved")
|
||
// rand = Math.floor(Math.random() * 99999999999999);
|
||
// } catch (err) {
|
||
// console.error(err)
|
||
// }
|
||
// }).catch(err => {
|
||
// console.log('err =', err)
|
||
// })
|
||
// (async () => {
|
||
// await interaction.editReply("File Saved as " + fileToSend);
|
||
// })();
|
||
// })
|
||
// })
|
||
// }
|
||
/**
|
||
*
|
||
* Start of CDX
|
||
*
|
||
*/
|
||
// if (commandToRun == "gobk") {
|
||
// // check for channel pwd support file
|
||
|
||
// if (fs.existsSync(path)) {
|
||
// console.log("Channel PWD is active")
|
||
// jsonfile.readFile(path, function (err, pwdata) {
|
||
// if (err) console.error(err)
|
||
// console.log(RemoveLastDirectoryPartOf(pwdata.pwd))
|
||
// //console.log(dir)
|
||
// if (RemoveLastDirectoryPartOf(pwdata.pwd).length == 0) {
|
||
// obj = {
|
||
// pwd: "/"
|
||
// }
|
||
// } else {
|
||
// obj = {
|
||
// pwd: RemoveLastDirectoryPartOf(pwdata.pwd)
|
||
// }
|
||
// }
|
||
// jsonfile.writeFile(path, obj, function (err) {
|
||
// (async () => {
|
||
// await interaction.editReply(obj.pwd);
|
||
// })();
|
||
// if (err) console.error(err)
|
||
// })
|
||
// });
|
||
// function RemoveLastDirectoryPartOf(the_url) {
|
||
// var the_arr = the_url.split('/');
|
||
// the_arr.pop();
|
||
// return (the_arr.join('/'));
|
||
// }
|
||
// function startsWith(str, word) {
|
||
// return str.lastIndexOf(word, 0) === 0;
|
||
// }
|
||
// }
|
||
// }
|
||
/**
|
||
*
|
||
* End of CDX
|
||
*
|
||
*/
|
||
/**
|
||
*
|
||
* Start of CD
|
||
*
|
||
*/
|
||
if (commandToRun.startsWith("cd")) {
|
||
console.log("test")
|
||
argscmd = interaction.options._hoistedOptions[0].value
|
||
if (argscmd == "..") {
|
||
(async () => {
|
||
await interaction.editReply("please use the gobk command to go back a directory")
|
||
})();
|
||
return
|
||
}
|
||
|
||
// check for channel pwd support file
|
||
|
||
if (fs.existsSync(path)) {
|
||
console.log("Channel PWD is active")
|
||
jsonfile = require('jsonfile')
|
||
jsonfile.readFile(path, function (err, pwdata) {
|
||
let argscmd = commandToRun.replace("cd ", "")
|
||
let dir = argscmd; // yes, start at 0, not 1. I hate that too.
|
||
|
||
|
||
if (startsWith(argscmd, "/") == false) {
|
||
const cmd = require('cmd-promise')
|
||
if (!argscmd) {
|
||
(async () => {
|
||
await interaction.editReply("Give my Syntax Please")
|
||
})();
|
||
return
|
||
}
|
||
|
||
let dir = commandToRun; // yes, start at 0, not 1. I hate that too.
|
||
let data
|
||
jsonfile.readFile(path, function (err, pwdata) {
|
||
if (err) console.error(err)
|
||
console.log(dir)
|
||
data = pwdata.pwd + "/" + argscmd
|
||
if (pwdata.pwd == "/") {
|
||
data = "/" + argscmd
|
||
}
|
||
if (argscmd == "~") {
|
||
data = "/root"
|
||
}
|
||
if (argscmd.includes("~") && argscmd.includes("/")) {
|
||
data = "/root" + "/" + argscmd.replace("~", "")
|
||
}
|
||
|
||
if (argscmd.includes("..") || argscmd.includes("../")) { // check if the user is trying to go back a directory
|
||
|
||
console.log(argscmd.split("../"))
|
||
console.log("user wants to go back " + argscmd.split("../").length + " directories")
|
||
|
||
function RemoveLastDirectoryPartOf(the_url, num) {
|
||
var the_arr = the_url.split('/');
|
||
the_arr.splice(-num, num)
|
||
return (the_arr.join('/'));
|
||
}
|
||
data = RemoveLastDirectoryPartOf(pwdata.pwd, argscmd.split("../").length - 1)
|
||
}
|
||
|
||
let final = data.replace(/([^:]\/)\/+/g, "$1")
|
||
console.log(final)
|
||
|
||
const obj = {
|
||
pwd: final
|
||
}
|
||
jsonfile.writeFile(path, obj, function (err) {
|
||
(async () => {
|
||
await interaction.editReply("Directory Changed to: " + final)
|
||
})();
|
||
if (err) console.error(err)
|
||
})
|
||
|
||
});
|
||
|
||
} else {
|
||
jsonfile.readFile(path, function (err, pwdata) {
|
||
if (err) console.error(err)
|
||
console.log('dir:' + dir)
|
||
//onsole.log(dir)
|
||
|
||
const obj = {
|
||
pwd: dir.replace(/([^:]\/)\/+/g, "$1")
|
||
}
|
||
jsonfile.writeFile(path, obj, function (err) {
|
||
if (err) console.error(err)
|
||
})
|
||
goNoFurther = false;
|
||
});
|
||
(async () => {
|
||
await interaction.editReply("Directory Changed to: " + dir.replace(/([^:]\/)\/+/g, "$1"))
|
||
})();
|
||
}
|
||
function RemoveLastDirectoryPartOf(the_url) {
|
||
var the_arr = the_url.split('/');
|
||
the_arr.pop();
|
||
return (the_arr.join('/'));
|
||
}
|
||
function startsWith(str, word) {
|
||
return str.lastIndexOf(word, 0) === 0;
|
||
}
|
||
})
|
||
}
|
||
}
|
||
/**
|
||
*
|
||
* End of CD
|
||
*
|
||
*/
|
||
if (commandToRun.startsWith("cd")) return console.log("Skipped At Main")
|
||
if (commandToRun.startsWith("write")) return
|
||
if (commandToRun == "gobk") return
|
||
|
||
if (fs.existsSync(path)) {
|
||
function RemoveLastDirectoryPartOf(the_url) {
|
||
var the_arr = the_url.split('/');
|
||
the_arr.pop();
|
||
return (the_arr.join('/'));
|
||
}
|
||
console.log("Channel PWD is active")
|
||
jsonfile.readFile(path, function (err, pwdata) {
|
||
console.log(pwdata)
|
||
if (code == "neofetch") {
|
||
code = "neofetch --stdout --color_blocks off"
|
||
}
|
||
if (code.startsWith("apt")) {
|
||
ifApt = "-y"
|
||
} else if (code.startsWith("yum")) {
|
||
ifApt = "-y"
|
||
}
|
||
else if (code.startsWith("pacman")) {
|
||
ifApt = "--noconfirm"
|
||
} else if (code.startsWith("apt-get")) {
|
||
ifApt = "-y"
|
||
}
|
||
else {
|
||
ifApt = ""
|
||
}
|
||
|
||
if (code.includes("~")) {
|
||
code = code.replace("~", "/root")
|
||
}
|
||
if (code.includes("..")) {
|
||
pwdata.pwd = RemoveLastDirectoryPartOf(pwdata.pwd)
|
||
}
|
||
|
||
|
||
// if (code.includes("../")) { // check if the user is trying to go back a directory
|
||
|
||
// function RemoveLastDirectoryPartOf(the_url, num) {
|
||
// var the_arr = the_url.split('/');
|
||
// the_arr.splice(-num, num)
|
||
// return (the_arr.join('/'));
|
||
// }
|
||
// console.log(argscmd.split("../"))
|
||
// console.log("user wants to go back " + argscmd.split("../").length -1 + " directories in their command")
|
||
|
||
// pwddata.pwd = RemoveLastDirectoryPartOf(pwdata.pwd, argscmd.split("../").length - 1)
|
||
// }
|
||
|
||
|
||
const customerContainer = docker.getContainer(interaction.user.id);
|
||
// Simple to grab the stdout and stderr.
|
||
customerContainer.exec(['/bin/bash', '-c', 'cd ' + pwdata.pwd + ' && ' + commandToRun], { stdout: true, stderr: true }, (err, out) => {
|
||
if (typeof (out) !== 'undefined') {
|
||
console.log(out.stdout)
|
||
|
||
if (out.inspect.ExitCode !== 0) {
|
||
if (out.stderr.includes("syntax error")) {
|
||
(async () => {
|
||
await interaction.editReply("```️️️️" + "There is an error in your syntax, please try again." + "```")
|
||
console.log(end)
|
||
|
||
})();
|
||
} else {
|
||
(async () => {
|
||
return await interaction.editReply("```️️️️" + out.stderr + "```")
|
||
console.log(end)
|
||
|
||
})();
|
||
}
|
||
}
|
||
if (out.inspect.ExitCode == 0) {
|
||
if (!out.stdout) {
|
||
|
||
const mainEmbed = new EmbedBuilder()
|
||
.setColor('#0099ff')
|
||
.setTitle('Command Executed Successfully!')
|
||
.setDescription('```' + commandToRun + ' has completed.```')
|
||
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: `${interaction.user.displayAvatarURL()}` });
|
||
(async () => {
|
||
return await interaction.editReply({ embeds: [mainEmbed] })
|
||
console.log(end)
|
||
|
||
})();
|
||
} else {
|
||
if (out.stdout.length > 2020) {
|
||
fs.writeFile('/tmp/paste', "Command: " + code.replace("--stdout --color_blocks off", "") + " | Container Owner: " + interaction.user.username + "\n" + out.stdout, err => {
|
||
if (err) {
|
||
console.error(err)
|
||
return
|
||
}
|
||
})
|
||
cmd("sleep 2; cat /tmp/paste | dpaste").then(pasteout => {
|
||
const mainEmbed = new EmbedBuilder()
|
||
.setColor('#0099ff')
|
||
.addFields(
|
||
{ name: 'Please check the below output log:', value: pasteout.stdout.replace("Pro tip: you can password protect your paste just by typing a username and password after your paste command.", "").replace("Paste Saved: ", "").replace("-------------------------------------------------------", "") },
|
||
).setTitle("Container Owner: " + interaction.user.username)
|
||
.setDescription("The command: " + code.replace("--stdout --color_blocks off", "") + " was too large for discord.")
|
||
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: `${interaction.user.displayAvatarURL()}` });
|
||
(async () => {
|
||
console.log(end)
|
||
return await interaction.editReply({ embeds: [mainEmbed] })
|
||
|
||
})();
|
||
|
||
})
|
||
}
|
||
else {
|
||
// console.log("ahah " + code)
|
||
if (code.includes("dpaste")) {
|
||
|
||
const mainEmbed = new EmbedBuilder()
|
||
.setColor('#0099ff')
|
||
.addFields(
|
||
{ name: 'View your Paste at the link below!', value: out.stdout.replace("Pro tip: you can password protect your paste just by typing a username and password after your paste command.", "").replace("Paste Saved: ", "").replace("-------------------------------------------------------", "") },
|
||
{ name: 'Pro Tip!', value: "You can protect your paste by typing a username and password after dpaste." },
|
||
).setTitle("Paste Saved!")
|
||
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: `${interaction.user.displayAvatarURL()}` });
|
||
(async () => {
|
||
return await interaction.editReply({ embeds: [mainEmbed] })
|
||
console.log(end)
|
||
|
||
})();
|
||
return
|
||
}
|
||
if (commandToRun.startsWith("cowsay") || commandToRun.startsWith("figlet")) {
|
||
(async () => {
|
||
await interaction.editReply("```️️️️" + out.stdout + "```")
|
||
})();
|
||
return
|
||
}
|
||
|
||
if (code.includes("figlet") || code.includes("figlet")) {
|
||
(async () => {
|
||
return await interaction.editReply("```️️️️" + out.stdout + "```")
|
||
console.log(end)
|
||
})();
|
||
}
|
||
//<@UserID NUMBER>
|
||
(async () => {
|
||
await interaction.editReply("```️️️️" + "Command: " + code.replace("--stdout --color_blocks off", "") + " | Container Owner: " + interaction.user.username + "\n" + out.stdout + "```")
|
||
console.log("<=================================END===========================>")
|
||
})();
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
(async () => {
|
||
await interaction.editReply("```️️️️" + "Your container either needs to be generated or is not running." + "```")
|
||
return console.log(end)
|
||
})();
|
||
}
|
||
})
|
||
})
|
||
}
|
||
}
|
||
},
|
||
}; |